題目:
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的迴圈雙向鍊錶。要求不能建立任何新的節點,只能調整樹中節點指標的指向。
leetcode原題鏈結
思路:
def
dfs(root):if
not root:
return
#邊界條件,到最左端的葉子節點時,return
dfs(root.left)
# 遍歷當前根節點的左子樹
print
(root.val)
# 對當前根節點做操作
dfs(root.right)
# 遍歷當前根節點的右子樹
pre用於記錄雙向鍊錶中位於當前節點root左側的節點,即上一次迭代中的root設定前驅節點pre為none。當pre==null時,當前節點root左側沒有節點,即此時root為雙向鍊錶中的頭節點
反之,pre!=null時,當前節點root左側存在節點pre,需要進行
pre.right=root
,root.left=pre
的操作。
二叉搜素樹的最左葉子節點是煉表頭節點。
dfs(root),遍歷到最左葉子節點的空子樹時,開始return,此後開始執行下圖紅框中的**。所以 遍歷到最左葉子節點【當前根節點是二叉樹的最左葉子節點】時,第一次進行if self.pre is none:的判斷,將此時的節點標記為煉表頭節點head,並標記此時節點為pre,為下一次的遍歷做準備。
#第乙個節點記為head,最後乙個節點記為tail
if root is
none
:return
self.pre=
none
dfs(root)
tail=self.pre#當此時遍歷到最後乙個節點時,是最後一次執行else語句塊中的內容,所以遍歷結束後的pre即tail
self.head.left=tail
tail.right=self.head
return self.head
二叉搜尋樹與雙向鍊錶
1.問題描述 輸入一顆二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。來自 劍指offer 2.分析 對於二叉搜尋樹我們知道,樹的左孩子都比根節點要下,樹的右孩子都比根結點要大,根據這個特點,我們進行中序遍歷得到的序列就會滿足題目的要求,我們...
二叉搜尋樹與雙向鍊錶
問題描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。演算法 struct binarytreenode binarytreenode convert binarytreenode prootoftree plastnodeinl...
二叉搜尋樹與雙向鍊錶
排序二叉樹與雙向鍊錶.cpp 定義控制台應用程式的入口點。題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。思路 通過對一顆排序二叉樹的認識可知一顆排序二叉樹中序輸出就是有序的 通過後序遍歷讓子樹分別找到自己的left和rig...