114. 二叉树展开为链表

已解答

中等

给你二叉树的根结点 root ,请你将它展开为一个单链表:

  • 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null
  • 展开后的单链表应该与二叉树 先序遍历 顺序相同。

示例 1:

2025-09-24T03:36:55.png

输入: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]
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    TreeNode pre = null;
    public void flatten(TreeNode root) {
        if (root == null) return;
        flatten(root.right);
        flatten(root.left);
        root.right=pre;
        root.left=null;
        pre=root;
    }
}

1. 遍历顺序:右 → 左 → 根

假设我们有二叉树:

    1
   / \
  2   5
 / \   \
3   4   6

先序遍历:1 → 2 → 3 → 4 → 5 → 6

我们要让展开后的链表是这个顺序。

2. 递归处理过程

我们定义 prev 为全局变量(或通过参数传递),表示当前已经处理好的链表的最后一个节点

递归函数 flatten(TreeNode root) 的作用
将以 root 为根的子树展开成链表,并更新 prev

处理顺序

  1. 先递归处理右子树
  2. 再递归处理左子树
  3. 最后处理根节点

3. 为什么是右 → 左 → 根?

因为我们要让链表顺序是先序遍历(根 → 左 → 右),但递归是"归来"时处理连接,所以要从后往前构建链表:

  • 先处理最右边的节点(6),它将是链表的末尾
  • 然后处理左边的节点(4, 3, 2)
  • 最后处理根节点(1)

这样在连接时,prev 始终指向当前已经构建好的链表的头部(实际上是已经构建部分的最后一个节点)。

分类: DS-Algo 标签: Java

评论

暂无评论数据

暂无评论数据

目录