zoukankan      html  css  js  c++  java
  • 树的孩子兄弟表示法建树


      树的表示方法有很多,在董永建老师的一本通里也有介绍,其中一种表示方法为孩子兄弟表示 法,但董老师没给出例程,经本人琢磨,勉强写了一个。

      如右图所示一棵,树的建立基本仿照扩展二叉树的原理,建树时,首先输入根值,接着再输入其所有孩子的值,以0结束。(若输入某个节点的所有孩子时,直接输入0,则说明这是一个叶节点,没有孩子)。

      根据这一规则,右图所示的树可依次输入1 2 4 0 3 0 0 5 6 0 0 7 0 0。为了检查是否建树成功,顺便写了个先根遍历输出,结果为:1-2-3-4-5-6-7。实现原理:单链表结构。

    #include<iostream>
    using namespace std;
    typedef struct node;
    typedef node * tree;
    struct node{//孩子兄弟表示法 
        int n;
        tree ch,next;//分别存放第一个孩子,并用链表结构存其兄弟 
    };
    void creat(tree &p)
    {
        cout<<p->n<<':';//输出根值,方便输入,其后依次输入各个孩子,以0结束 
        int x;
        //开始输入第一个孩子 
        cin>>x;
        if(x)
        {
            p->ch=new node;
            p->ch->n=x,p->ch->next=NULL,p->ch->ch=NULL;
        }
        else
        {
            p->ch=NULL; 
             return;//第一个孩子不存在,就不会有第二个孩子,也不会有孙子 
        }
        //输入第一个孩子的兄弟 
        tree t=p->ch;
        cin>>x;
        while(x)
        {
            t->next=new node;
            t->next->n=x;
            t=t->next;
            t->ch=NULL,t->next=NULL;
            cin>>x;
        }
        //递归每一个孩子的子树 
        t=p->ch;
        while(t)
         {
             creat(t);
             t=t->next;
         }
    }
    void pr(tree p)//前序输出这棵树 
    {
        tree t=p->ch;
        while(t)
        {
            cout<<'-'<<t->n;
            pr(t);
            t=t->next;
        }
    }
    int main(){
        tree p=new node,h;
        h=p;
        cin>>p->n;
        creat(p);
        cout<<p->n;
        pr(p);
        return 0;
    }
    全树程序

       如果树是二叉树,当然程序应该可以更简单一些。(每次都输入左、右儿子的值,如果相应儿子没就输入0,最后不用补0)。样例输入1 2 4 3 0 0 0 5 6 0 0 7 0 0 0。样例输出:1 2 3 4 5 6 7。

    #include<iostream>
    using namespace std;
    typedef struct node;
    typedef node *tree;
    struct node{
        int num;
        tree l,r;
    }; 
    void bult(tree &p)//引用形参,确保数据同步更改 
    {
        int x,y;
        cout<<p->num<<':';
        cin>>x>>y;
        if(x)
        {
            p->l=new node;
            p->l->num=x;
            bult(p->l);
        }
        else p->l=NULL;
        if(y)
        {
            p->r=new node;
            p->r->num=y;
            bult(p->r);
        }
        else p->r=NULL;
    }
    void pr(node *p)
    {
        if(p)
        {
            cout<<p->num<<' ';
            pr(p->l);
            pr(p->r);
        }
    }
    int main(){
        node *h,*p=new node;
        h=p;
        cin>>p->num;
        bult(p);
        pr(h);
        return 0;
    }
    二叉树程序

      如有写的不妥,请大神指教,不胜感激!

  • 相关阅读:
    从零入门 Serverless | Knative 带来的极致 Serverless 体验
    SpringCloud 应用在 Kubernetes 上的最佳实践 — 高可用(熔断)
    阿里巴巴成立云原生技术委员会,云原生升级为阿里技术新战略
    解构云原生,从概念到落地:阿里云、声网、微博、好未来、CNCF 的专家们怎么看?
    人工智能训练云燧T10
    云计算应用场景分析
    昇腾全栈解决方案
    自动驾驶解决方案架构
    自动驾驶开发云平台业务分析
    ResNet-50模型图像分类示例
  • 原文地址:https://www.cnblogs.com/wendcn/p/12510026.html
Copyright © 2011-2022 走看看