【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;
    }
}
相关推荐
卷福同学2 小时前
不用服务器,不用配环境,我10分钟上线了一个AI Agent
人工智能·后端·算法
码兄科技3 小时前
Java AI智能体开发实战:从零构建智能对话系统指南
java·开发语言·人工智能
折哥的程序人生 · 物流技术专研4 小时前
第8篇:六大设计原则在工厂模式中的体现
java·设计模式·设计原则·工厂模式·编程进阶·扩充系列
至乐活着4 小时前
深入解析跳表SkipList:原理、实现与性能优化实战
数据结构·算法·跳表·skiplist·java实现
小明bishe184 小时前
计算机毕业设计之基于JAVA的植物科普网站
java·spring boot·spring·架构·课程设计
r_oo_ki_e_5 小时前
Java Map 集合学习笔记
java·笔记·学习
SL-staff5 小时前
智慧园区2000+设备统一管理:JVS-IoT如何降低运维成本40%
java·开发语言·物联网·智慧园区·设备管理·运维优化·jvs-iot
Jerry5 小时前
LeetCode 383. 赎金信
算法
ai产品老杨5 小时前
H264 H265视频分析常见问题和排查清单
人工智能·算法·音视频
咖啡八杯6 小时前
GoF设计模式——模板方法模式
java·后端·spring·设计模式