1. 程式人生 > >[轉] 多叉樹轉換二叉樹

[轉] 多叉樹轉換二叉樹

我們 實現 images 9.png 技術 .cn open str isp

(轉自:多叉樹轉換二叉樹 - ~Lanly~ 原文日期:2017.01.19)

多叉轉二叉,前提是我們仍要把樹的信息保留下來,也就是誰是誰的孩子,誰是誰的兄弟。但是二叉只能保存兩個孩子,但我們可以把兩個孩子改成兩個關系,也就是我們利用二叉來儲存關系,一個是孩子,一個是兄弟。

於是,就出現了網上廣泛介紹的方法,當一個節點是另一個節點的孩子時,就放在父親節點的左孩子上,是兄弟,就該放在右孩子上,也就是所謂的“左兒子,右兄弟”。

技術分享

當然多叉轉二叉的形式不止一種,上圖是其中的一種。

因為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 }
代碼

[轉] 多叉樹轉換二叉樹