二叉樹中序遍歷的常見方法

2021-10-03 07:27:26 字數 1596 閱讀 2611

中序遍歷,是二叉樹遍歷的一種。在二叉樹中,中序遍歷首先遍歷左子樹,然後遍歷根節點,最後遍歷右子樹。

public listgetldrmethod1(treenode treenode) 

return result;

}

遞迴遍曆法就像概述中二叉樹定義的一種實現,首先遍歷左子樹,然後遍歷根節點,最後遍歷右子樹。這種方法一般用來求中序遍歷結果,因為遞迴遍歷過程中,方法引數過多本身也是一種資源浪費,而只傳遞節點的話又不好計算各種累加問題,因此該方法在演算法中,能用到場景較少。如果一定要用,也可以通過全域性變數的方式來完成。

public listgetldrmethod(treenode treenode) 

treenode = stack.pop();

result.add(treenode.val);

treenode = treenode.right;

}return result;

}

該迭代方法需要使用棧來儲存還未遍歷的節點,遍歷思路也比較簡單,一直向左遍歷,模擬先遍歷左子樹這一步。如果左為空,就記錄該節點值,模擬遍歷根節點這一步,然後向右遍歷,模擬遍歷右子樹這一步,一直迴圈到遍歷完所有節點。該方法在演算法中經常使用,無論是計算累加問題,還是判斷問題,相比遞迴方法更高效和容易理解,也不需要使用全域性變數,唯一的缺點就是需要引入新的棧空間,記錄還沒有遍歷的節點。

public listgetldrmethod3(treenode treenode) 

if (predecessor.right == null) else

} else

}return result;

}

看名字就知道該方法是乙個比較難理解的方法。難理解的方法又是相對比較高效的方法:morris遍歷是乙個不需要使用棧,僅僅使用乙個區域性變數就可以完成中序遍歷的高效方法。在講解**之前,我先簡單介紹morris中序遍歷的大致解決理念:

morris方法使每個節點的右指標都指向中序遍歷的下乙個節點

有了理念1,我們也可以說,每次指向right的時候,就是遍歷的時候

那麼它具體是怎麼做的呢:

假設根節點a的左子樹b沒有右子樹,那麼b的右子樹就是a。

假設根節點a的左子樹b有右子樹,那麼就一直向右遍歷,直到它沒有右子樹,設定它的右子樹為a

上述方案確定a的左子樹中序遍歷最後乙個節點 的 right 指向它自己,也就是保證左子樹遍歷完成後,遍歷根節點。左子樹遍歷完有兩種情況:

左子樹為空,說明這個節點沒有左子樹,當然也可以理解為左子樹已經遍歷完了

左子樹的右節點遞迴最終指向自己,說明它的左子樹已經遍歷完成了,同時刪掉這個右指標,維護樹結構。

帶著這些結論我們來解釋上述方法的工作原理:

如果左子樹為空,直接遍歷該節點,進入右子樹。

如果左子樹不為空,取它的左子樹節點,遞迴該節點的右指標,直到為空

設定該節點的右指標指向父節點,表示父節點的左子樹遍歷完成後,最後乙個幾點的right指向它。

如果該節點的右指標已經指向父節點了,說明該父節點的左子樹已經遍歷完了,刪除這個新加的right標記,遍歷該節點,進入右子樹

二叉樹中序遍歷

訪問根結點的的左子樹,訪問根結點和訪問根結點的右子樹依次記作 l,d r 中序遍歷 ldr 演算法 遍歷根結點的左子樹,訪問根結點 遍歷根結點的右子樹 對於上面的圖,我們假定只有a,b,c三個結點,則中序遍歷結果為 b a c 採用上節 二叉樹鏈式儲存和前序遍歷 中的遞迴推演 db a c d b ...

二叉樹中序遍歷

二叉樹中序遍歷 非遞迴版本的中序遍歷用棧來實現。乙個元素出現在棧頂一次,這一次會被處理並出棧。trick 用乙個指標去記錄當前節點cur,如果cur left左側還未遍歷,就會將cur入棧並訪問cur left。一行很重要的 是cur cur right,這一句之後如果cur null,則說明棧頂元...

二叉樹中序遍歷方法實現

對於二叉樹的遍歷,先序的方式是比較簡單的,但是中序和後序的方式還是有點麻煩的,這裡先給出乙個用c stack的遍歷方式 1.如果當前結點不為空 把當前結點壓入棧 p p left轉向其左孩子 2.如果當前結點為空 證明這半棵子樹已經遍歷完成,需要從棧頂找到樹根 取棧頂元素為當前結點,棧做一次彈棧操作...