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