二叉树的建立及其基本操作

  1. 参考课本中二叉链结点定义和基本操作算法,建立 btree.cpp 文件实现二
    叉链的结构体定义和基本操作函数。
  2. 建立 exp4-1.cpp 文件,引用 btree.cpp 文件,分别以函数形式实现以下操
    作,在 main 函数中用菜单形式实现各操作的选择调用:
    a) 按照先序次序建立一棵二叉树。
    此处先序次序指:先将二叉树补全为满二叉树,补充空结点用#代替,再
    进行先序遍历得到遍历序列(含#字符)。建立二叉树时不建立空结点(序
    列中对应#的结点)。
    b) 分别用先、中、后序递归遍历的方法遍历二叉树,输出遍历序列。
    c) 求二叉树的深度。

帮忙看看哪里不对
这是我写的btree.cpp

#include
#include
using namespace std;
#define MaxSize 100
typedef char ElemType;
typedef struct node
{
    ElemType data;
    struct node *lchild;
    struct node *rchild;
}BTNode;
void CreateBtree(BTNode *&b,char *str)//创建二叉树
{
    BTNode *St[MaxSize],*p;//St数组作为顺序栈
    int top=-1,k,j=0;
    char ch;
    b=NULL;
    ch=str[j];
    while(ch!='\0')
    {
        switch(ch)
        {
            case'(': top++;St[top]=p;k=1;break;
            case')':top--;break;
            case',':k=2;break;
            default:
                {
                    if(ch=='#')break;
                    p=(BTNode*)malloc(sizeof(BTNode));
                    p->data=ch;
                    p->lchild=NULL;
                    p->rchild=NULL;
                    if(b=NULL)
                        b=p;
                    else
                    {

                        switch(k)
                        {
                            case 1: St[top]->lchild=p;
                            case 2: St[top]->rchild=p;
                        }
                    }
                }
        }j++;
        ch=str[j];
    }
}
void DestoryBTree(BTNode *&b)//销毁二叉树
{
    if(b!=NULL)
    {
        DestoryBTree(b->lchild);
        DestoryBTree(b->rchild);
        free(b);
    }
}
BTNode *FindNode(BTNode *b,ElemType x)//查找结点
{
    BTNode *p;
    if(b==NULL)
    return NULL;
    else if(b->data==x)
        return b;
    else
    {
        p=FindNode(b->lchild,x);
        if(p!=NULL)
            return p;
        else
            return FindNode(b->rchild,x);
    }
}
BTNode *LchildNode(BTNode*p)//找孩子结点
{
    return p->lchild;
}
BTNode *RchildNode(BTNode*p)
{
    return p->rchild;
}
int BTHeight(BTNode *b)//求高度
{
    int lchildh,rchildh;
    if(b==NULL) return 0;
    else
    {
        lchildh=BTHeight(b->lchild);
        rchildh=BTHeight(b->rchild);
        return(lchildh>rchildh)? (lchildh+1):(rchildh+1);
    }
}

void PreOrder(BTNode *b)//先序遍历
{
    if(b!=NULL);
    {
        printf("%c",b->data);
        PreOrder(b->lchild);
        PreOrder(b->rchild);
    }
}
void InOrder(BTNode *b)//中序遍历
{
    if(b!=NULL);
    {
        InOrder(b->lchild);
        printf("%c",b->data);
        InOrder(b->rchild);
    }
}
void PostOrder(BTNode *b)//后序遍历
{
    if(b!=NULL);
    {
        PostOrder(b->lchild);
        PostOrder(b->rchild);
        printf("%c",b->data);
    }
}
void DispBTree(BTNode *b)//输出二叉树
{
    if(b!=NULL)
    {
        printf("%c",b->data);
        if(b->lchild!=NULL||b->rchild!=NULL)
        {
            printf("(");
            DispBTree(b->lchild);
            if(b->rchild!=NULL) printf(",");
            DispBTree(b->rchild);
            printf("(");
        }
    }
}



这是我写的exep4-1.cpp

#include
#include"btree.cpp"
#include
char str[MaxSize];
BTNode *lk;
void a(BTNode *&lk)
{
    printf("先序创建二叉树:");
    scanf("%s",&str);
    CreateBtree(lk,str);
}
void b(BTNode *lk)
{
    printf("先序遍历输出:");
    PreOrder(lk);
    printf("\n");
    printf("中序遍历输出:");
    InOrder(lk);
    printf("\n");
    printf("后序遍历输出:");
    PostOrder(lk);
    printf("\n");
}
void c(BTNode *lk)
{
    int h=BTHeight(lk);
    printf("%d\n",&h);
}
int main()
{
    int x;
    printf("1.先序次序建立二叉树.2.分别用先中后递归遍历的方法遍历输出二叉树.3.求二叉树的深度.4.退出\n");
    while(true)
    {
        printf("请选择要进行的操作:");
        scanf("%d",&x);
        switch(x)
       {
           case 1:
            {
              a(lk);
              break;
            }
           case 2:
            {
              b(lk);
              break;
            }
           case 3:
            {
              c(lk);
              break;
            }
           case 4:
            {
                exit(0);
            }
       }
    }
}