二叉树的各种应用与操作。

1.输入前序 求后序中序。
2. 输入二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列
3. 已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历
4. 已知一个按先序输入的字符序列,如abd,eg,cf,(其中,表示空结点)。请建立二叉树并求二叉树的层次遍历序列。
5. 一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历和层序遍历。
6. 已知二叉树的一个按先序遍历输入的字符序列,如abc,de,g,f, (其中,表示空结点)。请建立二叉树并求二叉树的叶子结点个数。
7. 给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
8. 已知一个按先序输入的字符序列,如abd,eg,cf,(其中,表示空结点)。请建立该二叉树并按从上到下从左到右的顺序输出该二叉树的所有叶子结点。
9. 已知一颗二叉树的中序遍历序列和后序遍历序列,求二叉树的深度。
我们对应题目进行总结。
已知前序abc,de,g,f,

node *creat(node *root,char *str)//建树
{
    if(str[++top]==',')
        root= NULL;
    else
    {
        root=new node; 
        root->data=str[top];
        root->l=creat(root->l,str);
        root->r=creat(root->r,str);
    }
    return root;
}

已知 先序和中序

tree *creat(int len,char s[60],char h[60])//头节点在先序。
{
    int i;
    tree *t;
    if(len<=0)
        return NULL;
    t=(tree *)malloc(sizeof(tree));
    t->date=s[0];
    for(i=0;i<len;i++)
    {
        if(h[i]==s[0])
            break;
    }
    t->l=creat(i,s+1,h);
    t->r=creat(len-i-1,s+i+1,h+i+1);
    return t;
}

已知中后 求先

node *creat(int n,char *str1,char *str2)//头节点在后序最后一个
{
    int i;
    node *p;
    if(n==0)
        return NULL;
    p=new node;
    p->data=str2[n-1];
    for(i=0;i<n;i++)
        {
            if(str1[i]==str2[n-1])
                break;
        }
    p->l=creat(i,str1,str2);
    p->r=creat(n-i-1,str1+i+1,str2+i);
    return p;
}

前中后序输出在这里就不写了。简单的递归。
写一下层序

	void cengxu(tree *root)
{
    tree *p[101];
    int flas=0;
    int glas=0;
    if(root)
        p[flas++]=root;
    while(flas>glas)
    {
        root=p[glas++];
        printf("%c",root->data);
        if(root->l)
            p[flas++]=root->l;
        if(root->r)
            p[flas++]=root->r;
    }
}

接下来是叶子数

int leave(node *root)
{
    if(root==NULL)
        return 0;
    if(root->l==NULL&&root->r==NULL)
        return 1;
    else
        return leave(root->l)+leave(root->r);
}

还有树的深度

int depth(node *p)
{
    int lt,rt,c;
    if(!p)
        c=0;
    else
    {
        lt=depth(p->l);
        rt=depth(p->r);
        if(lt<rt)
        {
            c=rt+1;
        }
        else 
        {
            c=lt+1;
        }
    }
    return c;
  }

最后就是 按从上到下从左到右的顺序输出二叉树的叶子结点。

void cengxu(node *root)//利用层序来逐层判断。
{
    if(root==NULL)
    {
        return ;
    }
    int i=0;
    int n=0;
    node *a[100];
    a[n++]=root;
    while(i<n)
    {
        if(a[i])
        {
            if(a[i]->l==NULL&&a[i]->r==NULL)
                printf("%c",a[i]->data);
            if(a[i]->l!=NULL)
                a[n++]=a[i]->l;
            if(a[i]->r!=NULL)
                a[n++]=a[i]->r;
        }
    i++;
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值