樹的表示方法有很多,在董永建老師的一本通里也有介紹,其中一種表示方法為孩子兄弟表示 法,但董老師沒給出例程,經本人琢磨,勉強寫了一個。
如右圖所示一棵,樹的建立基本仿照擴展二叉樹的原理,建樹時,首先輸入根值,接着再輸入其所有孩子的值,以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; }
如有寫的不妥,請大神指教,不勝感激!