【題目】
對二叉樹的節點來說,有本身的值域,有指向左孩子和右孩子的兩個指標;對雙向鍊錶的節點來說,有本身的值域,有指向上乙個節點和下乙個節點的指標。在結構上,兩種結構有相似性,現在有一棵搜尋二叉樹,請將其轉換為乙個有序的雙向鍊錶。最後返回轉換後的雙向鍊錶的頭節點。
【基本思路】
方法一。時間複雜度o(n),空間複雜度o(n)。
使用佇列等容器收集二叉樹中序遍歷的結果,收集完畢後在按照佇列中的順序將每個節點串起來。**實現如下:
#python3.5
defconvert1
(head):
definordertoqueue
(head, queue):
if head == none:
return
inordertoqueue(head.left, queue)
inordertoqueue(head.right, queue)
if head == none:
return
none
queue =
inordertoqueue(head, queue)
head = queue.pop(0)
head.left = none
newhead = head
while queue:
node = queue.pop(0)
head.right = node
node.left = head
head = node
head.right = none
return newhead
方法二。時間複雜度o(n),空間複雜度o(h)。
利用遞迴函式。乙個頭節點為head的二叉樹轉換成有序雙向鍊錶,首先將head的左子樹和右子樹轉換成有序雙向鍊錶l1和l2,然後讓head節點連線l1鍊錶的尾節點和l2鍊錶的頭節點。改寫後序遞迴即可。
問題的關鍵是如何快速定位乙個雙向鍊錶的頭節點和尾節點,解決的方法是,使雙向鍊錶尾節點的right指標指向頭節點,遞迴的時候返回鍊錶的尾節點,這樣不僅可以得到鍊錶的尾節點,也可以根據right指標很快的得到頭節點。當然,遞迴結束後要將鍊錶的結構還原。**實現如下:
def
convert2
(head):
defprocess
(head):
if head == none:
return
lefte = process(head.left)
righte = process(head.right)
lefth = none
if lefte == none
else lefte.right
righth = none
if righte == none
else righte.right
if lefte != none
and righte != none:
lefte.right = head
head.left = lefte
righth.left = head
head.right = righth
righte.right = lefth
return righte
elif lefte != none:
lefte.right = head
head.left = lefte
head.right = lefth
return head
elif righte != none:
head.right = righth
righth.left = head
righte.right = head
return righte
else:
head.right = head
return head
if head == none:
return
none
tail = process(head)
head = tail.right
tail.right = none
return head
將搜尋二叉樹轉換成雙向鍊錶
對二叉樹的節點來說,有本身的值域,有指向左孩子和右孩子的兩個指標 對雙向鍊錶的節點來說,有本身的值域,有指向上乙個節點和下乙個節點的指標。在結構上,兩種結構有相似性,現在有一棵搜尋二叉樹,請將其轉換為乙個有序的雙向鍊錶。用兩種方法求解本題。方法一 由於是搜尋二叉樹,直接求出其中序遍歷序列,構造雙向鍊...
將搜尋二叉樹轉換成雙向鍊錶
題目 對二叉樹的節點來說,有本身的值域,有指向左孩子和右孩子的兩個指標 對雙向鍊錶的節點來說,有本身的值域,有指向上乙個節點和下乙個節點的指標。在結構上,兩種結構有相似性,現在有一棵搜尋二叉樹,請將其轉換為乙個有序的雙向鍊錶。public class convertdn public static ...
將搜尋二叉樹轉換成雙向鍊錶
題目 將搜尋二叉樹轉換成雙向鍊錶 程式設計師 面試指南 第26題 p81 難度 尉 頭一回做二叉樹的題,著實有點艱難。首先就倒在了牛客上面生成二叉樹的問題。題目給的示例輸入是這樣子的 9 6 4 7 4 2 5 2 1 3 5 0 0 1 0 0 3 0 0 7 0 9 9 8 0 8 0 0如果按...