中等
給定乙個二叉樹,原地將它展開為鍊錶。
例如,給定二叉樹
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 ...