iOS數據結構與算法實戰 - Binary Tree Traversal

二叉樹的周遊算法

  • 前序遍歷:visit(node),preorder(left Subtree), preorder(right Subtree)。
  • 中序遍歷:in-order(left Subtree),visit(node),in-order(right Subtree)。
  • 後序遍歷:post-order(left Subtree),post-order(right Subtree),visit(node)。
  • 層級遍歷:一層層訪問每一個節點。

經過上述四種方式遍歷二叉樹的每一個節點。node

練習周遊算法的技巧 1

周遊算法練習1

思路:通常咱們習慣 ,根節點-左節點-右節點,這樣的模型,咱們就把例如上圖A的左子樹當作一個塊,相似一個大節點用括號圈起來,一樣的右子樹也這樣作。而後每一個塊裏作前中後遍歷。git

  • 前序遍歷。A,(B,D,E),(C,F,G)。獲得結果是 A,B,D,E,C,F,G 。github

  • 中序遍歷。(D,B,E),A,(F,C,G)。獲得的結果是 D,B,E,A,F,C,G 。算法

  • 後序遍歷。(D,E,B),(F,G,C),A。獲得的結果是 D,E,B,F,G,C,A 。post

  • 層級遍歷。 A,B,C,D,E,F,G 。3d

練習周遊算法的技巧 2

周遊算法練習2

前序遍歷思路:每一個節點從左邊畫線一直到底部這個線,而後按照從左到右的順序讀取節點。 結果是:A,B,D,E,C,F,G 。cdn

周遊算法練習3

中序遍歷思路:每一個節點從中間畫線到底部這個線,而後按照從左到右的順序讀取節點。 結果是 D,B,E,A,F,C,G 。blog

周遊算法練習4

後序遍歷思路:每一個節點從右邊畫線到底部這條線,而後從左到右的順序讀取節點。 結果是 D,E,B,F,G,C,A 。get

練習周遊算法的技巧 3

周遊算法練習5

前序遍歷思路:從每一個節點左邊畫出一個線,而後從根結點開始轉一圈,通過每一個節點和樹的分支,包裹這個樹。通過這些短線的順序就是結果。A,B,D,E,C,F,G 。it

周遊算法練習6

中序遍歷思路:從每一個節點底部邊畫出一個線,而後從根結點開始轉一圈,通過每一個節點和樹的分支,包裹這個樹。通過這些短線的順序就是結果。D,B,E,A,F,C,G 。

周遊算法練習7

後序遍歷思路:從每一個節點右邊畫出一個線,而後從根結點開始轉一圈,通過每一個節點和樹的分支,包裹這個樹。通過這些短線的順序就是結果。D,E,B,F,G,C,A 。

延伸

  • 前序遍歷,中序遍歷,後續遍歷的思想是按照深度優先的順序遍歷的。層級遍歷的思想是按照廣度優先的順序遍歷的。
  • 因爲要遍歷樹的每一個節點所以時間複雜度是O(n)。
  • 廣度優先遍歷思想的層級遍歷須要的額外的空間是O(w),w是這個二叉樹的最大的寬,好比Perfect Binary Tree這種狀況下最大節點在最後一層,第i層至多擁有2i-1個節點,所以須要額外空間O(Ceil(n/2));深度優先遍歷思想的其餘三種方式須要額外空間是O(h),這個h是二叉樹的最大高度,好比一個平衡樹h是Log2(n) ,可是對於極不平衡的左傾斜或者右傾斜樹來講h就是n 。因此在最壞的狀況下,二者所需的額外空間是O(n)。但最壞的狀況發生在不一樣類型的樹木上,所以針對不一樣種類不一樣性質的樹須要的額外空間有不盡相同。從以上能夠明顯看出,當樹更平衡時,廣度優先遍歷思想的層級遍歷所需的額外空間可能更多,而且當樹不太平衡時,深度優先遍歷思想的其餘三種遍歷方式的額外空間可能更多。

Github

github.com/renmoqiqi/1…

相關文章
相關標籤/搜索