先中後序遍歷遞迴的性質造成遍歷時總是「貪婪」的,肯定會一條路走到底,再回溯,而層序遍歷並不需要我們這樣,層序遍歷需要我們「走走停停」,所以層序遍歷肯定不能遞迴實現,那如何實現呢?
以上圖為例,遍歷10,8,12沒有問題,它們分別是root,root.left,root.right。然後我們希望列印6,9,11,13,這裡我們並不需要這4個節點,只要8和12節點就好了,因為這4個節點正是8.left,8.right,12.left,12.right。由此可以得出如果需要列印n+1層的節點,我們需要有n層的節點列表(好吧,我承認這是bfs(breadth-first search)的精髓所在)。基於此,我們給出下面的演算法,這是python**,雖然我覺得指令碼語言已經比較能speak itself了,但還是附上注釋,我現在開始相信write things down的力量。
上面的演算法需要額外的空間s(n),n為樹的節點總數,如果不需要儲存列印節點以備後用,則list_will_print_node可以不用,但不管怎麼樣queue_not_print_node總是需要的。
我們說遍歷時一般要麼用遞迴要麼用stack(非遞迴),這些方法都涉及到額外空間,那麼有沒有一種遍歷可以不需要額外空間呢,答案是肯定的。
樹的遍歷與列印
樹的遍歷與列印 樹的遍歷有三種方法,先 中 後序遍歷。這三種方法都是以子樹的根節點作為參照系的,比如先序的意思就是把先列印根節點,中 後序以此類推。遍歷演算法的核心思想是遞迴,這不是偶然的,本質上是因為樹結構的定義就是 遞 歸 的。樹的定義 1 樹是有限點的集合 2 有且只有乙個根節點 3 集合中其...
非遞迴二叉樹的遍歷列印
請用非遞迴方式實現二叉樹的先序 中序和後序的遍歷列印。給定乙個二叉樹的根結點root,請依次返回二叉樹的先序,中序和後續遍歷 二維陣列的形式 先序 先序遍歷的規則 根 左 右 先序遍歷的結果 1 2 4 5 3 6 7 舉例說明 1 節點1入棧,彈出 列印 2 將彈出的節點1的右孩子3先入棧,左孩子...
樹 與 二叉樹 的遍歷
樹也是圖,遍歷方法自然也分為廣度優先和深度優先。但對於樹,由於結點的排序有規則,所以其遍歷結果產生唯一的結點序列,而不像 圖 那樣產生多種可能的結果。1 廣度優先遍歷 自根部向下,依次訪問完第一層的所有結點後,然後逐層訪問各子樹上同一層次的所有結點,以此類推,直至 最大深度上的結點都訪問完畢為止。層...