W3 school 菜鸟教程 我要自学网 信息学奥赛NOI 花哥的博客 不逼自己一把,怎知自己有多优秀——校长语录

树的孩子兄弟表示法建树


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

  如右图所示一棵,树的建立基本仿照扩展二叉树的原理,建树时,首先输入根值,接着再输入其所有孩子的值,以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;
}
二叉树程序

 

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

posted @ 2020-03-17 13:13  耍人  阅读(2626)  评论(0编辑  收藏  举报