树的孩子兄弟表示法建树
树的表示方法有很多,在董永建老师的一本通里也有介绍,其中一种表示方法为孩子兄弟表示 法,但董老师没给出例程,经本人琢磨,勉强写了一个。
如右图所示一棵,树的建立基本仿照扩展二叉树的原理,建树时,首先输入根值,接着再输入其所有孩子的值,以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; }
如有写的不妥,请大神指教,不胜感激!