【LeetCodehot100】T114:二叉树展开为链表 T105:从前序与中序遍历构造二叉树

T114:二叉树展开为链表

题目要求:

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

展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。

展开后的单链表应该与二叉树 先序遍历 顺序相同。

核心思路

前序遍历顺序+指针重排

具体操作:

  1. 先展开左子树
  2. 再展开右子树
  3. 把左子树移到右边
  4. 把原右子树接到末尾

代码实现

java 复制代码
public void flatten(TreeNode root) {
    if (root == null) return;

    // 1️⃣ 递归展开左右子树
    flatten(root.left);
    flatten(root.right);

    // 2️⃣ 保存原右子树
    TreeNode right = root.right;

    // 3️⃣ 左子树移到右边
    root.right = root.left;
    root.left = null;

    // 4️⃣ 找右链尾节点
    TreeNode cur = root;
    while (cur.right != null) {
        cur = cur.right;
    }

    // 5️⃣ 接上原右子树
    cur.right = right;
}

本题感悟

掌握前序遍历顺序+指针重排的具体流程

  1. 先展开左子树
  2. 再展开右子树
  3. 把左子树移到右边
  4. 把原右子树接到末尾

T105:从前序与中序遍历构造二叉树

题目要求:

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

核心思路

前序遍历

根 → 左 → 右

作用:

确定"根节点"
中序遍历

左 → 根 → 右

作用:

划分左右子树
前序找根,中序分左右,递归构建

思路

1️⃣ 用 preorderpreL 找到根

2️⃣ 在 inorder 中找到根的位置 index

3️⃣ 计算左子树大小 leftSize

4️⃣ 划分左右子树范围

5️⃣ 递归构建左右子树

代码实现

java 复制代码
class Solution {

    Map<Integer, Integer> map = new HashMap<>();

    public TreeNode buildTree(int[] preorder, int[] inorder) {

        // 建立中序索引
        for (int i = 0; i < inorder.length; i++) {
            map.put(inorder[i], i);
        }

        return build(preorder, 0, preorder.length - 1,
                     inorder, 0, inorder.length - 1);
    }

    private TreeNode build(int[] preorder, int preL, int preR,
                           int[] inorder, int inL, int inR) {

        if (preL > preR) return null;

        // 1️⃣ 根节点
        int rootVal = preorder[preL];
        TreeNode root = new TreeNode(rootVal);

        // 2️⃣ 找中序位置
        int index = map.get(rootVal);

        // 3️⃣ 左子树大小
        int leftSize = index - inL;

        // 4️⃣ 左子树
        root.left = build(preorder, preL + 1, preL + leftSize,
                          inorder, inL, index - 1);

        // 5️⃣ 右子树
        root.right = build(preorder, preL + leftSize + 1, preR,
                           inorder, index + 1, inR);

        return root;
    }
}
相关推荐
乐迪信息5 分钟前
如何通过AI防爆摄像机精准判断船舶超速?
大数据·人工智能·算法·安全·目标跟踪
小荷才露尖尖角,早有蜻蜓立上头42 分钟前
过滤器的4种创建方式
java
大圣编蚕1 小时前
Java ByteArrayInputStream 详解:从入门到实战
java·开发语言·算法
程序员阿明1 小时前
idea把插件啥的不默认放在C盘
java·ide·intellij-idea
linweidong2 小时前
中科闻歌Java面试题及参考答案
java·python·大模型·提示词·ai agent·mcp·rag原理
OpenAnolis小助手2 小时前
一句话看透 JVM,SysOM 诊断 Skill 新增 Java 应用诊断能力
java·开发语言·jvm·阿里云·操作系统控制台·sysom
小玮看世界2 小时前
[Python]OD算法在OD实际运用转化参考清单
开发语言·python·算法
黎阳之光2 小时前
数字孪生赋能全域水网,实现水资源管控与节水降碳双向提升
人工智能·物联网·算法·安全·数字孪生
随意起个昵称2 小时前
【BFS】冰面滑行
算法·宽度优先
ForteScarlet2 小时前
Kotlin 2.4.20 现已发布,新特性多不多?
android·java·开发语言·开源·kotlin·jetbrains