树的孩子兄弟表示法建树

Posted wendcn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树的孩子兄弟表示法建树相关的知识,希望对你有一定的参考价值。


技术图片

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

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

 

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

以上是关于树的孩子兄弟表示法建树的主要内容,如果未能解决你的问题,请参考以下文章

树的高度(并不需要建树,并不需要考虑谁是谁的孩子,因为输入保证了先父节点)

数据结构用孩子兄弟表示法创建好了树之后运行程序的时候怎么输入树中的结点?

1 数据结构(13)_二叉树的概念及常用操作实现

数据结构开发(22):二叉树的转换深层特性与存储结构设计

数据结构--树

C语言数据结构算法——为儿子兄弟树的叶子结点赋值