給定乙個二叉樹,原地將它展開為乙個單鏈表。
例如,給定二叉樹
1/ \
2 5
/ \ \
3 4 6
將其展開為:1\
2\3\
4\5\
6
# definition for a binary tree node.
# class treenode(object):
# def __init__(self, val=0, left=none, right=none):
# self.val = val
# self.left = left
# self.right = right
class solution(object):
def flatten(self, root):
""":type root: treenode
:rtype: none do not return anything, modify root in-place instead.
"""if not root:
return
self.flatten(root.left)
self.flatten(root.right)
temp = root.right
root.right = root.left
root.left = none
while root.right != none:
root = root.right
root.right = temp
return
對於每乙個節點而言,他們需要做的事情是一樣的,即我們可以使用遞迴的方式來解這道題。每個節點的左子節點應該是已經排好序的鍊錶,右子節點也是排好序的列表,所以要做的就是把左邊的鍊錶插入到右邊,並把左邊的節點設定為空。最後我們需要乙個臨時變數來儲存右子節點。
class solution(object):
def flatten(self, root):
""":type root: treenode
:rtype: none do not return anything, modify root in-place instead.
"""if not root:
return
stack = [root]
prev = none
while stack:
node = stack.pop()
if prev:
prev.left = none
prev.right = node
if node.right:
if node.left:
prev = node
可以使用輔助棧模擬遞迴,由於是前序遍歷,所以需要先把根節點pop出來,然後再將右子節點和左子節點先後壓入棧中。此外我們需要乙個中間變數prev用來儲存前乙個節點,這樣就能保證前乙個節點能按順序指向當前節點。 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 ...