114. 二叉树展开为链表

🔗 题目链接114. 二叉树展开为链表

  • 核心要点

    • 原地修改:不能创建新的TreeNode链表,必须直接修改原二叉树的left和right指针;

    • 顺序要求:单链表顺序 = 原二叉树前序遍历顺序(根 → 左 → 右);

    • 指针规范:所有节点的left指针必须置为null,right指针串联整个链表

  • 核心思路:以当前root为基准,递归左右树,使左树变成链表,右树同理,那么怎么拼接成答案呢??定义临时变量存储二者,使左为null,右为存储的左链表,最后递归root定位最后一个非空节点,指向先前存储的right即可

💻途中遇到的一些纠结点:

🔥代码实现(Java)

/**
 * 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 {
    public void flatten(TreeNode root) {
        // 1. 如果当前节点为空,直接返回
        if (root == null) return;

        // 2. 递归展平左子树和右子树
        flatten(root.left);
        flatten(root.right);

        // 3. 保存左右子树到临时变量
        TreeNode left = root.left;
        TreeNode right = root.right;

        // 4. 将左子树移动到右子树位置,左子树置空
        root.left = null;
        root.right = left;

        // 5. 找到当前右子树的末尾
        TreeNode copy = root;
        while (copy.right != null) {
            copy = copy.right;
        }

        // 6. 将原来的右子树接到末尾
        copy.right = right;
    }
}

📎 复杂度分析

  • 时间复杂度:O(n),其中 n 是二叉树节点数。每个节点访问一次。
  • 空间复杂度:O(h),其中 h 是二叉树的高度。递归栈的深度取决于树的高度(最坏情况为 O(n))。