多叉轉二叉,前提是我們仍要把樹的信息保留下來,也就是誰是誰的孩子,誰是誰的兄弟。但是二叉只能保存兩個孩子,但我們可以把兩個孩子改成兩個關系,也就是我們利用二叉來儲存關系,一個是孩子,一個是兄弟。
於是,就出現了網上廣泛介紹的方法,當一個節點是另一個節點的孩子時,就放在父親節點的左孩子上,是兄弟,就該放在右孩子上,也就是所謂的“左兒子,右兄弟”。
當然多叉轉二叉的形式不止一種,上圖是其中的一種。
因為2,3,4都是1的孩子,所以都位於1的左子樹里。至於誰跟1相連,這個順序不唯一,但不影響,看是如何讀取吧。
然后對於2,3,4互為兄弟,所以都放在各自的右子樹里。
7是4的孩子,所以7就放在4的左子樹上。
5,6是二的孩子,就放在2的左子樹上。
5,6互為兄弟,就放到6(或5)的右子樹上。
實現方法
一、
1.讀入a,b表示a是b的孩子
2.如果b的左孩子為空,那么a就放在b的左孩子,否則循環b的左孩子的右孩子直到該孩子的右孩子為空為止,放到該孩子的右孩子上。

1 for (int i=1;i<=m;i++) 2 { 3 cin>>a>>b //a是b的孩子 4 if (tree[b].l==0) tree[b].l=a; 5 else { 6 int tmp=tree[b].l; 7 while (tree[tmp].r!=0) tmp=tree[tmp].r;//直到該孩子沒有右孩子為止 8 tree[tmp].r=a; 9 } 10 }
二、
當孩子過多的時候,會發現循環可能會過慢,降低效率。
我們還可以用類似儲存鏈式前向星的方法,讓父親的左孩子為讀入的孩子,然后這個孩子的右孩子是父親的之前第一個左孩子。
如:
我們現在讀入的是4是1的孩子,按照方法一的話最終是這樣的
很明顯當右孩子過多的時候,循環可能會過久,方法二減小循環就是這樣做的:
讀入4是1的孩子,那么
把1的左孩子給4的右孩子
然后4給1的左孩子
最終就是這樣子啦~

1 for (int i=1;i<=m;i++) 2 { 3 cin>>a>>b //a是b的孩子 4 tree[a].r=tree[b].l; //把b的左孩子給a的右孩子 5 tree[b].l=a; //把a給b的左孩子 6 }