題目分析:
給定一個二叉樹,原地將它展開爲鏈表。例如,給定二叉樹
將其展開爲:
解題思路:
看其展開的順序是類似前序遍歷,但是解題還是需要思路,二叉樹一般可以用遞歸和非遞歸解決
(1)遞歸
變換過程
1
/ \
2 5
/ \ \
3 4 6
1
/ \
2 5
\ \
3 6
\
4
1
\
2
\
3
\
4
\
5
\
6
- 一直找左節點,直到沒左節點了
self.flatten(root.left)
- 返回一層,遞歸右節點
self.flatten(root.right)
- 備份右節點
tmp = root.right
- 完畢後將當前節點的右節點設置爲當前節點的左節點,同時將當前左節點設爲None
root.right = root.left
root.left = None
- 將備份的右節點添加到現在右節點的末尾
while root.right: root = root.right
root.right = tmp
- 返回上一層遞歸
(2)非遞歸,循環解決
變換過程
1
/ \
2 5
/ \ \
3 4 6
1
\
2
/ \
3 4
\
5
\
6
1
\
2
\
3
\
4
\
5
\
6
- 備份根節點
bf_root = root
- 備份根節點右節點
p = bf_root.left
- 尋找到左節點下的最後一個右節點
while p.right: p = p.right
- 將備份的根節點的右節點作爲根節點左節點的最後一個右節點
p.right = bf_root.right
- 將根節點的右節點設置爲當前根節點的左節點,同時左節點設置爲None
bf_root.right = bf_root.left
bf_root.left = None
- 循環上述步驟
提交代碼1:(遞歸,Runtime: 36 ms, faster than 98.79% )
class Solution:
def flatten(self, root: TreeNode) -> None:
if root:
self.flatten(root.left)
self.flatten(root.right)
tmp = root.right
root.right = root.left
root.left = None
while root.right: root = root.right
root.right = tmp
提交代碼2:(循環,Runtime: 36 ms, faster than 98.79% )
class Solution:
def flatten(self, root: TreeNode) -> None:
bf_root = root
while bf_root:
if bf_root.left:
p = bf_root.left
while p.right: p = p.right
p.right = bf_root.right
bf_root.right = bf_root.left
bf_root.left = None
bf_root = bf_root.right