鍊錶問題 將搜尋二叉樹轉換成雙向鍊錶

2021-08-11 02:50:53 字數 2174 閱讀 8285

【題目】

對二叉樹的節點來說,有本身的值域,有指向左孩子和右孩子的兩個指標;對雙向鍊錶的節點來說,有本身的值域,有指向上乙個節點和下乙個節點的指標。在結構上,兩種結構有相似性,現在有一棵搜尋二叉樹,請將其轉換為乙個有序的雙向鍊錶。最後返回轉換後的雙向鍊錶的頭節點。

【基本思路】

方法一。時間複雜度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如果按...