题目描述:
给定一个二叉树,原地将它展开为一个单链表。
例如,给定二叉树
1
/ \
2 5
/ \ \
3 4 6
将其展开为:
1
\
2
\
3
\
4
\
5
\
6
个人思路:
还是优先考虑使用递归来完成。递归的核心在于:在递归主体只对root节点进行相应的处理,剩下来的操作通过递归调用左右孩子节点来完成。本题需要将二叉树转化为一个链表,也就是需要将二叉树上的左子树和右子树进行合并,合并的规则是:将左子树转化为链表,将右子树也转化为链表,随后将右子树接到左子树链表的尾部,并设置左子树为None。
从这个规则不难分析出,本题是一个后序遍历,因此在编写递归代码时,可以大致套用后序遍历的递归代码。
具体代码如下:
class Solution:
def flatten(self, root: TreeNode) -> None:
if not root:
return None
def helper(root):
if not root:
return None
# 首先处理左右子节点
left = helper(root.left)
right = helper(root.right)
# 递归主体只对当前root节点进行处理,此时左右子树已经转化为了链表,以下部分对应朴素后续遍历中的print等类似操作
if left: # 将左孩子拼接到右孩子上,并设置左孩子为None
node = left
while node.right:
node = node.right
node.right = right
root.left = None
root.right = left
return root
helper(root)