题目分析:
给定一个二叉树,原地将它展开为链表。例如,给定二叉树
将其展开为:
解题思路:
看其展开的顺序是类似前序遍历,但是解题还是需要思路,二叉树一般可以用递归和非递归解决
(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