数据结构 5.28

#include <stdio.h>
#include <stdlib.h>

typedef struct BiTNode{
    char data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

int init(BiTree &t)//存在的意义并不大 
{
    t=NULL;
    return 1;
}

int BiTreedestroy(BiTree &t)
{
    if(t)
    {
        if(t->lchild)
            BiTreedestroy(t->lchild);
        if(t->rchild)
            BiTreedestroy(t->rchild);
        free(t);
        t=NULL;
    }
    return 1;
}

void BiTreecreate(BiTree &t)
{
    char ch;
    char pch[]="ABD$$EHJ$$KL$$M$N$$$CF$$G$I$$";
    static int i=0;
    ch=pch[i++];
    
    if(ch=='$')
    t=NULL;
    else 
    {
        t=(BiTree)malloc(sizeof(BiTNode));
        if(!t)   exit(-1);
        t->data=ch;
        BiTreecreate(t->lchild);
        BiTreecreate(t->rchild); 
    }
}


void pre_order_traveral(BiTree t)
{
    if(t)
    {
        printf("%c ",t->data);
        pre_order_traveral(t->lchild);
        pre_order_traveral(t->rchild);
    }
}

int flag=1; 
void pre_order_traveral_brackets1(BiTree t)
{  //A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I))) 
    if(t)
    {
        printf("%c",t->data);
        if(t->lchild||t->rchild)
        {
            printf("(");flag++;
        }        
        pre_order_traveral_brackets1(t->lchild);
        if(t->rchild)
        //if(t->lchild||t->rchild)这个用来判断的是有(A,)的情况
        //输出案例没有关于“有左子树没右子树的”显示需求,故不用,但用这条语句会更合理些 
        printf(",");
        pre_order_traveral_brackets1(t->rchild);
    }
}
void pre_order_traveral_brackets(BiTree t)
{  //A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I))) 
    if(t)
    {
        printf("%c",t->data);
        //if(t->lchild||t->rchild)  
        printf("(");
        pre_order_traveral_brackets1(t->lchild);
        while(--flag)
        {
            printf(")");
        }
        //if(t->lchild)
        printf(",");
        pre_order_traveral_brackets1(t->rchild);
        while(flag--+1)
        {
            printf(")");
        }
    }
}

int max(int a,int b)
{
    return a>b?a:b;
}
int BiTreedeep(BiTree t)
{
    if(t==NULL)
    return 0;
    else
    {
        if(t->lchild==NULL&&t->rchild==NULL)
            return 1;
        else
            return 1+max(BiTreedeep(t->lchild),BiTreedeep(t->rchild));
            
    }
}

int main(){

    BiTree binarytree;
    if(init(binarytree))
    printf("创建二叉树成功!\n"); 
    BiTreecreate(binarytree);
    
    printf("输出二叉树:");
    pre_order_traveral_brackets(binarytree);

    printf("\n二叉树 bt 的高度: %d\n",BiTreedeep(binarytree));
    
    if(BiTreedestroy(binarytree))
    printf("释放二叉树成功!"); 
}

猜你喜欢

转载自www.cnblogs.com/mingye/p/10936354.html
今日推荐