题目:
给你二叉树的根结点 root ,请你将它展开为一个单链表:
- 展开后的单链表应该同样使用
TreeNode,其中right子指针指向链表中下一个结点,而左子指针始终为null。 - 展开后的单链表应该与二叉树 先序遍历 顺序相同。
示例 1:

输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [0]
输出:[0]
提示:
- 树中结点数在范围
[0, 2000]内 -100 <= Node.val <= 100
思路如下:
这道题的思想是通过递归的方式,将二叉树的左子树和右子树分别展平,然后调整当前节点的左右子树,将左子树移到右子树的位置,并将原来的右子树接回。最终,整个二叉树被展平为一个只包含右子节点的单链表。
题解如下:
# 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: Optional[TreeNode]) -> None:
"""
Do not return anything, modify root in-place instead.
"""
if not root:
return
# 递归展平左子树
self.flatten(root.left)
# 递归展平右子树
self.flatten(root.right)
# 保存当前节点的左子树和右子树
left = root.left
right = root.right
# 将当前节点的左子树置为 None
root.left = None
# 将左子树移到右子树的位置
root.right = left
# 找到当前右链表的末尾节点
p = root
while p.right:
p = p.right # 将指针 p 移动到右子节点。
# 将原来的右子树接回当前右链表的末尾
p.right = right
题解示例:
示例1
逻辑梳理:
- 递归展平左子树和右子树
- 递归思想:对于每个节点,先递归地将它的左子树和右子树分别展平为单链表。
- 终止条件:如果当前节点为空,直接返回。
- 递归调用:分别对左子树和右子树进行递归调用,确保它们都被展平。
- 保存当前节点的左子树和右子树
- 在调整当前节点的左右子树之前,先保存左子树和右子树到变量
left和right中,以免丢失。
- 将左子树移到右子树的位置
- 将当前节点的左子树置为
None。 - 将左子树移到右子树的位置,这样当前节点的右子树就变成了原来的左子树。
- 找到当前右链表的末尾节点
- 从当前节点开始,遍历右链表,直到找到末尾节点
p。这一步是为了找到右链表的最后一个节点,以便将原来的右子树接回。
- 将原来的右子树接回
- 将原来的右子树(保存在
right中)接回到当前右链表的末尾节点p的右子节点位置。
&spm=1001.2101.3001.5002&articleId=147125478&d=1&t=3&u=f3c5e693839a4f76a5b8abb77fc24fe0)
481

被折叠的 条评论
为什么被折叠?



