方法一:
# def preOrderTravel(self,root,listnode):
# if not root:
# return None
# listnode.append(root.val)
# self.preOrderTravel(root.left,listnode)
# self.preOrderTravel(root.right,listnode)
# def flatten(self, root: TreeNode) -> None:
# """
# Do not return anything, modify root in-place instead.
# """
# listnode=[]
# self.preOrderTravel(root,listnode)
# pnode=root
# for i in range(1,len(listnode)):
# pnode.left=None
# pnode.right=TreeNode(listnode[i])
# pnode=pnode.right
# return root
方法二:
def flatten(self, root: TreeNode) -> None:
"""
Do not return anything, modify root in-place instead.
"""
# 鲁棒性
if not root:
return None
# 递归(后序遍历)
self.flatten(root.left)
self.flatten(root.right)
if root.left:
#左树接右位
right = root.right
root.right = root.left
root.left = None
#右树接最后
while root.right:
root = root.right
root.right = right
有小伙伴可能又要问了,为什么不直接像以下这样操作呢?
if root.left:
temp = root.right
root.right = root.left
root.left = None
root.right.right = temp
这不是刚好原来的右树接到原来左树后吗?我一开始写的时候也犯了这个错误,让我们来结合图示看一下。
第一次递归回去,好像是对的。
但第二次递归回去就明显不对了,这是因为我们将原来的右树直接接在原来的左树上,丢失了3和4节点。因此,我们要在这里加一个while循环,确保接到最后面的节点,即本题的节点4,这样才正确。
参考:https://blog.csdn.net/qq_39315740/article/details/89004628