程式設計之美 分層遍歷二叉樹

2021-06-28 13:47:24 字數 2152 閱讀 5605

問題:給定乙個二叉樹,要求按分層遍歷該二叉樹,即從上到下按層次訪問該二叉樹(每一層將單獨輸出一行),每一層要求訪問的順序為從左到右,並將節點依次編號。那麼分層遍歷如圖的二叉樹,正確的輸出應該為:

分析與解法

關於二叉樹的問題,由於其本身固有的遞迴特性,通常可以用遞迴解決。為了解決給出的問題,我們可以發現。當解決問題2時,問題就迎刃而解了。現先分析問題2

假設要訪問二叉樹第k層的節點,那麼其實可以把它轉換為分別訪問「已該二叉樹根結點的左右子節點為根結點的兩顆子樹」中層次為k-1的節點。如題目中的二叉樹,給定k=2,即要求訪問原二叉樹中第2層的節點(根結點為第0層),可以把它轉換為分別訪問以節點2、3為根結點的兩顆子樹中的k-1=1層的節點。

所以遍歷第k層節點的**如下(把最終結果存放在了list裡):

public boolean printnodeatlevel(treenode root, int level, listlist) 

if (level == 0 && root != null)

boolean left = printnodeatlevel(root.left, level-1, list);

boolean rigth = printnodeatlevel(root.right, level-1, list);

return left || rigth;

}

所以分層遍歷的問題也就解決了,只需要從第0層,一直呼叫到二叉樹的最後一層,就可以完全遍歷了。但是二叉樹的最大層數怎麼求。也是遞迴的**:

public int maxdepth(treenode root) 

int left = 1+maxdepth(root.left);

int rigth = 1+maxdepth(root.right);

return left > rigth ? left : rigth;

}

好了,問題就解決了。好像發現這樣的效率太低了。把求深度和遍歷某層次的**合併,得到如下**:

public list> levelorder2(treenode root) 

return lists;

}

但是發現,這種效率實在是太低了,因為每次訪問都需要從跟節點訪問,直到訪問完成。下面的**採用了游標的方式:cur代表當前訪問的節點,last代表當前層次的最後乙個節點。**比較好懂,如下:

public list> levelorder3(treenode root) 

if (node.left != null)

cur++;

}lists.add(list);

}return lists;

}

好,至此關於程式設計之美上面的關於本題的解法就沒了。我接下來在說兩種方案,是我在沒看本書解答時,自己寫的。

方法一,是用了兩個佇列,乙個佇列儲存k-1層的節點,另乙個佇列儲存k層的節點。**如下:

public list> levelorder1(treenode root) 

lists.add(list);

while (!prequeue.isempty())

if (node.right != null)

}prequeue = new linkedlist<>(curqueue);

}return lists;

}

個人感覺也挺高效的,但是兩個佇列,實現有點浪費。於是,改造成了如下**

public list> levelorder4(treenode root) 

if (node.right != null)

list.add(node.val);

}lists.add(0, list);

}return lists;

}

個人感覺,這是四種裡面最好的辦法了。。。。。你認為呢?

程式設計之美 分層遍歷二叉樹

問題定義 給定一棵二叉樹,要求按分層遍歷該二叉樹,即從上到下按層次訪問該二叉樹 每一層將單獨輸出一行 每一層要求訪問的順序為從左到右,並將節點依次編號。下面是乙個例子 輸出 1 2 34 5 6 7 8節點的定義 1structnode 書上舉出兩個解法。第乙個解法是用遞迴方式,搜尋並列印某一層的節...

《程式設計之美 分層遍歷二叉樹》的另外兩個實現

之前重溫本書寫 書評時,也嘗試找尋更好的程式設計解法。今天把另乙個問題的實現和大家分享。給定一棵二叉樹,要求按分層遍歷該二叉樹,即從上到下按層次訪問該二叉樹 每一層將單獨輸出一行 每一層要求訪問的順序為從左到右,並將節點依次編號。下面是乙個例子 節點的定義 書上的解法 書上舉出兩個解法。第乙個解法是...

《程式設計之美 分層遍歷二叉樹》的另外兩個實現

之前重溫本書寫書評時,也嘗試找尋更好的程式設計解法。今天把另乙個問題的實現和大家分享。給定一棵二叉樹,要求按分層遍歷該二叉樹,即從上到下按層次訪問該二叉樹 每一層將單獨輸出一行 每一層要求訪問的順序為從左到右,並將節點依次編號。下面是乙個例子 輸出 1 2 34 5 6 7 8節點的定義 struc...