114. 二叉树展开为链表
给定一个二叉树,原地将它展开为一个单链表。
前序遍历(递归)+二叉树整理
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def flatten(self, root: TreeNode) -> None:
"""
Do not return anything, modify root in-place instead.
"""
TreeList = list()
self.TreeNode2List(TreeList,root)
print(TreeList)
for i in range(1, len(TreeList)):
node, leaf = TreeList[i - 1], TreeList[i]
node.left = None
node.right = leaf
def TreeNode2List(self,TreeList,root):
if(root is None):
return
TreeList.append(root)
self.TreeNode2List(TreeList,root.left)
self.TreeNode2List(TreeList,root.right)
优化(参考题解三):
这个做法很巧妙,不像上面的做法是先遍历在排序,它是直接在原始树的结构上更改,就不用存储树的信息。
要注意的是,这个前驱结点并不是最后一个实际上被访问的节点,而是你把这个右子树放到前驱结点的右面,能保证是最后被访问的结点,比如:
这个树,最后一个被访问的结点(前序遍历)应该是③,但是前驱结点应该是①,因为①的右子树一定是最后被遍历的,搞懂了这一点就好做了。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def flatten(self, root: TreeNode) -> None:
"""
Do not return anything, modify root in-place instead.
"""
node = root
while(node):
if(node.left):
nex = curr = node.left
while(curr.right):
curr = curr.right
curr.right = node.right
node.left,node.right = None,nex
node = node.right