树的孩子兄弟表示法建树

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

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

相关文章: