二叉树基本运算

要求实现二叉树的基本运算,如创建二叉树、求树的高度,树的遍历。
二叉树结构定义如下:

typedef char ElemType;
typedef struct node
{
    ElemType data;                //数据元素
    struct node *lchild;        //指向左孩子
    struct node *rchild;        //指向右孩子
} BTNode;

函数接口定义:

void CreateBTNode(BTNode *&b,char *str); //根据括号表示法的str,创建二叉树b。 
int BTNodeDepth(BTNode *b);  //求二叉树b的深度。 
void PreOrder(BTNode *b);   //先序遍历二叉树b 
void InOrder(BTNode *b); //中序遍历二叉树b 
void PostOrder(BTNode *b);  //后序遍历二叉树b  
void TravLevel(BTNode *b);  //层次遍历二叉树b  
void DestroyBTNode(BTNode *&b);  //销毁二叉树b。 (由裁判程序实现,略去)

注意:输出遍历序列时,每个结点字符之后均有空格符。

裁判测试程序样例:

int main()
{    
    BTNode *b,*p,*lp,*rp;
    char str[100];
    scanf("%s",str);  
    CreateBTNode(b,str);  //括号表示法创建二叉树 
    printf("Depth:%d\n",BTNodeDepth(b));
    printf("PreOrder:  ");
    PreOrder(b);          //先序遍历
    printf("\n");
    printf("InOrder:  ");
    InOrder(b);           //中序遍历
    printf("\n");
    printf("PostOrder:  ");
    PostOrder(b);         //后序遍历
    printf("\n");
    printf("TravLevel:  ");
    TravLevel(b);   //层次遍历 
    DestroyBTNode(b);  //释放二叉树b 
    return 0;
}

/* 请在这里填写答案 */
 

输入样例:

A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))

输出样例:

Depth:7
PreOrder:  A B D E H J K L M N C F G I 
InOrder:  D B J H L K M N E A F C G I 
PostOrder:  D J L N M K H E B F I G C A 
TravLevel:  A B C D E F G H I J K L M N 

代码实现:

void CreateBTNode(BTNode *&b,char *str)
{
    BTNode *S[100],*p;
    int top=-1,k,j=0;
    char ch;
    b=NULL;
    ch=str[j];
    while(ch!='\0'){
        switch(ch){
            case '(':top++;S[top]=p;k=1;break;
            case ')':top--;break;
            case ',':k=2;break;
            default:
                p=(BTNode *)malloc(sizeof(BTNode));
                p->data=ch;
                p->lchild=p->rchild=NULL;
                if(b==NULL)
                    b=p;
                else{
                    switch(k)
                    {
                        case 1:S[top]->lchild=p;break;
                        case 2:S[top]->rchild=p;break;
                    }
                }
        }
        j++;
        ch=str[j];
    }
} 
int BTNodeDepth(BTNode *b){
    int llength,rlength;
    if(b==NULL) return 0;
    else{
        llength=BTNodeDepth(b->lchild);
        rlength=BTNodeDepth(b->rchild);
    }
    return llength>rlength?(llength+1):(rlength+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 TravLevel(BTNode *b){
    BTNode *a[100];
    int i=0,j=0;
    a[0]=b;
    while(b){
        BTNode *p=a[j];
        printf("%c ",p->data);
        if(p->lchild)
            a[++i]=p->lchild;
        if(p->rchild)
            a[++i]=p->rchild;
        if(i==j) break;
        j++;
        b=a[j];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值