二叉树展开为链表
描述
中等
给定一个二叉树,原地将它展开为链表。
例如,给定二叉树
1
/ \
2 5
/ \ \
3 4 6
将其展开为:
1
\
2
\
3
\
4
\
5
\
6
解题
展开的结果类似于将二叉树进行先序遍历然后按顺序挂在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.
"""
if not root:
return
stack = [root]
pre = None
while stack:
temp = stack.pop()
if pre:
pre.right = temp
pre.left = None
# 右子树先进后出,出栈先遍历左子树
if temp.right:
stack.append(temp.right)
if temp.left:
stack.append(temp.left)
pre = temp
按照遍历的顺序一个个重排链表
# 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.
"""
cur = root
while cur:
# 若左子树为空,则不需要重排,直接考虑右子树节点
if not cur.left:
cur = cur.right
else:
# 找到左子树最右边的节点p
p = cur.left
while p.right:
p = p.right
# 将当前节点的右子树接到其左子树最右边节点的右孩子位置
p.right = cur.right
# 将其左子树接到右子树上
cur.right = cur.left
# 设置当前左子树为None
cur.left = None
# 下一个节点
cur = cur.right