数据结构(二叉树)

#include<iostream>
#include<malloc.h>
using namespace std;
typedef char  ElemType;
typedef struct node
{
    ElemType data;
    struct node *lchild;//指向左孩子节点
    struct node *rchild;//指向右孩子节点
}BTNode;

int Create(BTNode *&b)
{
b=(BTNode *)malloc(sizeof(BTNode));
    ElemType ch;
    cin>>ch;
    if(ch=='#')
        b=NULL;//如果字符为’#’,则表示空
    else {
            //判断指针是否创建成功
          //if(!(b=(BTNode *)malloc(sizeof(BTNode))));
       //return 1;
        b->data=ch;
        Create(b->lchild);
        Create(b->rchild);
    }
    return 1;

}


void Disp(BTNode *b,int Layer)
{

    if(b!=NULL)
    {
        Disp(b->rchild,Layer+1);

        for(int i=0;i<Layer;i++)
            cout<<"   ";

        cout<<b->data<<" ";
cout<<endl<<endl;
Disp(b->lchild,Layer+1);

    }
}

void Destroy(BTNode *&b)
{
    if(b!=NULL)
    {
        Destroy(b->lchild);
        Destroy(b->rchild);
        free(b);

    }

}

BTNode *Find(BTNode *b,ElemType x)
{BTNode *p;

    if(b==NULL)
        return NULL;
    else if(b->data==x)
        return b;
    else
    {
        p=Find(b->lchild,x);
        if(p!=NULL)
            return p;
        else
            return Find(b->rchild,x);
    }
}

BTNode *Lchild(BTNode *p)
{
    return p->lchild;
}
BTNode *Rchild(BTNode *p)
{

    return p->rchild;
}

int Height(BTNode *b)
{
    int lheight,rheight;
    if(b==NULL)
        return 0;
    else{
        lheight=Height(b->lchild);
        rheight=Height(b->rchild);
        return (lheight>rheight)?(lheight+1):(rheight+1);
    }
}
//先序遍历二叉树
void PreOrder(BTNode *b)
{
    if(b!=NULL)
    {
        cout<<b->data;
        PreOrder(b->lchild);
        PreOrder(b->rchild);
    }

}
//中序遍历二叉树
void InOrder(BTNode *b)
{
    if(b!=NULL)
    {
        InOrder(b->lchild);
        cout<<b->data;
        InOrder(b->rchild);
    }
}
//后序遍历二叉树
void PostOrder(BTNode *b)
{
    if(b!=NULL)
    {
        PostOrder(b->lchild);
        PostOrder(b->rchild);
        cout<<b->data;
    }
}

int CountLeaf(BTNode *b)
{
    if(b==NULL)
        return 0;
    else if(!b->lchild&&!b->rchild)
        return 1;
    else
        return CountLeaf(b->lchild)+CountLeaf(b->rchild);


}

int Depth(BTNode *b)
{
    int l,r;
    if(b==NULL)
        return NULL;
        else
        {
            l=Depth(b->lchild);
            r=Depth(b->rchild);
            return(l>r)?(l+1):(r+1);
        }
}

int main()
{

    BTNode *b;
    Create(b);
    Disp(b,0);

    cout<<endl<<"先序遍历 : ";
    PreOrder(b);
    cout<<endl<<"中序遍历 : ";
    InOrder(b);
    cout<<endl<<"后序遍历 : ";
    PostOrder(b);
cout<<endl<<"叶子数是: "<<CountLeaf(b);
cout<<endl<<"深度是: "<<Depth(b);

    return 0;
}



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值