leetcode 114 二叉樹展開為鍊錶

2021-10-25 03:37:53 字數 1915 閱讀 7507

中等

給定乙個二叉樹,原地將它展開為鍊錶。

例如,給定二叉樹

1

/ \2 5

/ \ \

3 4 6

將其展開為:

1

\ 2\3

\4\5

\6

展開的結果類似於將二叉樹進行先序遍歷然後按順序掛在right指標上

如果是每遍歷乙個值就把他掛在右邊,容易丟棄原來的右子樹

所以設定乙個棧,用來儲存各子樹

# definition for a binary tree node.

# class treenode:

# def __init__(self, val=0, left=none, right=none):

# self.val = val

# self.left = left

# self.right = right

class

solution

:def

flatten

(self, root: treenode)

->

none

:"""

do not return anything, modify root in-place instead.

"""ifnot root:

return

stack =

[root]

pre =

none

while stack:

temp = stack.pop(

)if pre:

pre.right = temp

pre.left =

none

# 右子樹先進後出,出棧先遍歷左子樹

if temp.right:

if temp.left:

pre = temp

按照遍歷的順序乙個個重排鍊錶

# definition for a binary tree node.

# class treenode:

# def __init__(self, val=0, left=none, right=none):

# self.val = val

# self.left = left

# self.right = right

class

solution

:def

flatten

(self, root: treenode)

->

none

:"""

do not return anything, modify root in-place instead.

"""cur = root

while cur:

# 若左子樹為空,則不需要重排,直接考慮右子樹節點

ifnot cur.left:

cur = cur.right

else

:# 找到左子樹最右邊的節點p

p = cur.left

while p.right:

p = p.right

# 將當前節點的右子樹接到其左子樹最右邊節點的右孩子位置

p.right = cur.right

# 將其左子樹接到右子樹上

cur.right = cur.left

# 設定當前左子樹為none

cur.left =

none

# 下乙個節點

cur = cur.right

leetcode114 二叉樹展開為鍊錶

給定乙個二叉樹,原地將它展開為鍊錶。先把左右展開,右放左最後,左放右,左置空 definition for a binary tree node.class treenode def init self,x self.val x self.left none self.right none clas...

Leetcode 114 二叉樹展開為鍊錶

給定乙個二叉樹,原地將它展開為鍊錶。例如,給定二叉樹 1 2 5 3 4 6 複製 將其展開為 1 2 3 4 5 6 複製 這算是比較經典的一道題目了,博主面試快手的時候原題。最開始一想,覺得遞迴的求解不就好了,但是遞迴的時候發現需要注意乙個地方就是 需要先遞迴右子樹,然後記錄下右子樹展開完成之後...

leetcode 114 二叉樹展開為鍊錶

給定乙個二叉樹,原地將它展開為鍊錶。例如,給定二叉樹 1 2 5 3 4 6將其展開為 1 2 3 4 5 6採用二叉樹後序遍歷 python 如下 class treenode object def init self,x self.val x self.left none self.right ...