问题不难,时间紧张。

1、假设二叉树的结点值是字符型,根据输入的一棵二叉树的完整先序遍历序列(子树空用’#’表示),建立一棵以二叉链表存储表示的二叉树。
2、对二叉树进行先序、中序和后序遍历操作,并输出遍历序列,观察输出的序列是否与逻辑上的序列一致。
3、主程序中要求设计一个菜单,允许用户通过菜单来多次选择执行哪一种遍历操作。

样例可以自己造一些试试,我试的:
abd###ce##f#g##
这个构造的二叉树如下:

img


#include <iostream>
using namespace std;
struct node{
    char c;
    node* lp;
    node* rp;
};
typedef node* nptr;
void creattree(nptr& t){
    char temp;
    cin>>temp;
    if(temp=='#') t=NULL;
    else{
        t=new node;
        t->c=temp;
        t->lp=NULL;
        t->rp=NULL;
        creattree(t->lp);
        creattree(t->rp);
    }
    return;
}
void preorder(nptr t){
    if(t==NULL) return;
    cout<<t->c<<' ';
    preorder(t->lp);
    preorder(t->rp);
    return;
}
void inorder(nptr t){
    if(t==NULL) return;
    inorder(t->lp);
    cout<<t->c<<' ';
    inorder(t->rp);
    return;
}
void postorder(nptr t){
    if(t==NULL) return;
    postorder(t->lp);
    postorder(t->rp);
    cout<<t->c<<' ';
    return;
}
int main(){
    nptr head=NULL;
    cout<<"请输入一个二叉树:"<<endl;
    creattree(head);
    while(1){
        cout<<"请选择你要执行的命令:\n0.结束操作\n1.先序遍历\n2.中序遍历\n3.后序遍历\n";
        int oo;
        cin>>oo;
        switch(oo){
            case 0:return 0;
            case 1:preorder(head);cout<<endl;break;
            case 2:inorder(head);cout<<endl;break;
            case 3:postorder(head);cout<<endl;break;
        }
    }
}

参考案例代码如下

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 30  
#define NULL 0
#define ok 1
#define overflow -2
typedef char ElemType;
typedef struct BiTreeNode
{
  ElemType data;
  struct BiTreeNode *LChild,*RChild;   //队头指针,队尾指针;
  int height;  //二叉树高度
}BiTreeNode,*BiTree;
//先序建立二叉树
void InitBiTree(BiTree &T)
{
  return;
}
BiTree CreateBiTree( char *str,int i,int m)
{
  BiTree p;
  if(i>=m){
      return NULL;}
    p=new BiTreeNode;
    p->data=str[i];
    printf("%c",p->data);
    p->LChild=CreateBiTree(str,2*i+1,m);  //创建结点左子树
    p->RChild=CreateBiTree(str,2*i+2,m);  //创建结点右子树
  return p;
}
//访问
void visit(char c)
{
 printf("the node is :%c\n",c);
}

//先序遍历二叉树
void PreOrder(BiTree T)
{ 
 if(T!=NULL) 
 {
 visit(T->data); //访问根结点
 PreOrder(T->LChild);  //先序遍历左子树
  PreOrder(T->RChild);  //先序遍历右子树
}
}
//中序遍历二叉树
void InOrder(BiTree T)
{ 
 if(T!=NULL) 
 {
 InOrder(T->LChild);  //中序遍历左子树
visit(T->data);  //访问根结点
  InOrder(T->RChild);  //中序遍历右子树
 }
 }

//后序遍历二叉树
void PostOrder(BiTree T)
{ 
 if(T!=NULL)  
 {
 PostOrder(T->LChild);  //后序遍历左子树
  PostOrder(T->RChild);  //后序遍历右子树
visit(T->data); //访问根结点
}
}
//统计结点个数
int  PreOrderCount(BiTree pointer)
{
    int count=0;
 if(pointer==NULL) return NULL;
 else {
     count++;
 PreOrderCount(pointer->LChild);  //先序遍历左子树
 PreOrderCount(pointer->RChild);  //先序遍历右子树
}
 return count;
}
void main()
{
   int i,n;
   char str[MAXSIZE];
    BiTree root;
//int a,height=0;
    int select;

  do {
printf("\n frist be use must be initiated !\n");
printf("please choose (0--7):\n");
printf("====================menu==========\n");
printf("        1   to initBiTree       \n");
printf("        2   to CreateBiTree       \n");
printf("        3    to PreOrder  \n");
printf("        4   to    InOrder\n");
printf("        5    to PostOrder \n");
//printf("        6    the NoderHeight   \n");
printf("          0      exit     \n");
printf("\n======================================\n");
scanf("%d",&select);
switch(select)
{
case 1:
    { system("cls");
    InitBiTree(root);
      printf("the bitree have been initated!\n");
       break;
    }
case 2:
    {  system("cls");
       printf("please input a BiTree node num:\n");
    scanf("%d",&n);
    getchar(); // 接收上一下语句scanf后的回车符
    printf("please input a string which length is %d:",n);
    for(i=0;i<n;i++)
        str[i]=getchar();
    printf("\n\n");
    root=CreateBiTree(str,0,n);
    printf(" the tree is already creat\n");
    break;

}
case 3:
    {  system("cls");
      printf("preorder traverse\n");
       PreOrder(root);
    
      break;
    }
case 4:
    {  system("cls");
printf("Inorder traverse\n");
       InOrder(root);
      break;
    }
case 5:
    {  system("cls");
printf("PostOrder traverse\n");
       PostOrder(root);
     break;
    }

case 0: exit(0);

}
  }while(select<=8);
}

中序遍历

void InOrder(BtNode* ptr)
{
    if (ptr != nullptr)
    {
        InOrder(ptr->leftchild);
        cout << ptr->data << "  ";
        InOrder(ptr->rightchild);
    }
}

前序遍历

void PreOrder(BtNode* ptr)
{
    if (ptr != nullptr)
    {
        cout << ptr->data << "  ";
        PreOrder(ptr->leftchild);
        PreOrder(ptr->rightchild);
    }
}

后续遍历


void PassOrder(BtNode* ptr)   //
{
    if (ptr != nullptr)
    {
        PassOrder(ptr->leftchild);
        PassOrder(ptr->rightchild);
        cout << ptr->data << "   ";
    }
}