代码编织梦想

剑指 Offer 07. 重建二叉树

难度中等940

输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。

假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

示例 1:

img

Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]

示例 2:

Input: preorder = [-1], inorder = [-1]
Output: [-1]

限制:

0 <= 节点个数 <= 5000

注意:本题与主站 105 题重复:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/

题解:剑指 Offer 07. 重建二叉树(分治算法,清晰图解)

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    HashMap<Integer, Integer> map = new HashMap<>();//标记中序遍历
    int[] preorder;//保留的先序遍历,方便递归时依据索引查看先序遍历的值

    public TreeNode buildTree(int[] preorder, int[] inorder) {
        this.preorder = preorder;
        //将中序遍历的值及索引放在map中,方便递归时获取左子树与右子树的数量及其根的索引
        for (int i = 0; i < inorder.length; i++) {
            map.put(inorder[i], i);
        }
        //三个索引分别为
        //当前根的的索引
        //递归树的左边界,即数组左边界
        //递归树的右边界,即数组右边界
        return recur(0,0,inorder.length-1);
    }

    TreeNode recur(int pre_root, int in_left, int in_right){
        if(in_left > in_right) return null;// 相等的话就是自己
        TreeNode root = new TreeNode(preorder[pre_root]);//获取root节点
        int idx = map.get(preorder[pre_root]);//获取在中序遍历中根节点所在索引,以方便获取左子树的数量
        //左子树的根的索引为先序中的根节点+1 
        //递归左子树的左边界为原来的中序in_left
        //递归左子树的右边界为中序中的根节点索引-1
        root.left = recur(pre_root+1, in_left, idx-1);
        //右子树的根的索引为先序中的 当前根位置 + 左子树的数量 + 1
        //递归右子树的左边界为中序中当前根节点+1
        //递归右子树的右边界为中序中原来右子树的边界
        root.right = recur(pre_root + (idx - in_left) + 1, idx+1, in_right);
        return root;

    }

}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42958831/article/details/127935428

leetcode 剑指 Offer 07. 重建二叉树の解题思路-爱代码爱编程

题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7

【LeetCode】剑指 Offer 07. 重建二叉树 - Go 语言题解-爱代码爱编程

文章目录 一、题目描述二、解题思路三、我的题解 一、题目描述 输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 示例 1: Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] Output: [3,

剑指offer07.重建二叉树_意难平丶njupt的博客-爱代码爱编程

0517刷题自用 题目描述 某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点 代码 class Solution { public: TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { i

剑指offer07. 重建二叉树_伍六琪的博客-爱代码爱编程

剑指Offer07. 重建二叉树 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 示例 1: Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] Output: [3,9,20,null,null,

【leetcode】【简单】【4】70. 爬楼梯_岁月漫长_的博客-爱代码爱编程

题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 动态规划 参考链接:动态规划详解 简单来说,动态规划其实就是,给定一个问题,我

day2-[滑动窗口]你给我领悟_阿琛与树的博客-爱代码爱编程

代码随想录算法训练营Day2 977, 有序数组的平方 给了提示双指针,一遍过芜湖,不多解释. class Solution: def sortedSquares(self, nums: List[int])

[山东科技大学oj]1382 problem a: 编写函数:三个数的最大最小值 (append code)_嵙-计算机之光的博客-爱代码爱编程

  Time Limit: 1 Sec  Memory Limit: 2 MB Submit: 19745  Solved: 11808 [Submit][Status] Description 给出三个数a,b,c,最大值是?最小值是? -------------------------------------------------------

[剑指 offer 28]对称的二叉树_呆呆比特的博客-爱代码爱编程

[剑指 Offer 28]对称的二叉树 题目 请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如 二叉树 [1,2,2,3,4,4,3] 是对称的: 1 / \

pthread使用_superdali的博客-爱代码爱编程

阅读Android源码的时候,发现有线程相关的东西,有点陌生了。所以重新温习一下POSIX标准的线程的几种使用方式,本文不涉及深层次原理性的解读,纯粹提供集中线程使用代码,以供熟悉API使用。 进程与线程 做应用开发的时

数据结构实验教程-第一套_kilig*的博客-爱代码爱编程

1.在平衡二叉树中插入一个结点后造成了不平衡,设最低的不平衡结点为A,并已知A的左孩子的平衡因子为1,右孩子的平衡因子为0,则应作_型调整以使其平衡。 A.LL B.LR C.RL D.RR 答案为a,错选了c。 平衡因

leetcode每日一题(587. erect the fence)_wangjun861205的博客-爱代码爱编程

You are given an array trees where trees[i] = [xi, yi] represents the location of a tree in the garden. You are

一个数组的异或和是指数组中所有的数异或在一起的结果,给定一个数组arr,求最大子数组异或和。_朂後 哋箹萣的博客-爱代码爱编程

问题描述:         一个数组的异或和是指数组中所有的数异或在一起的结果,给定一个数组arr,求最大子数组异或和。 异或运算规则:         异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的

[一篇读懂]c语言八讲:数据结构概述_哈斯塔a的博客-爱代码爱编程

[一篇读懂]C语言八讲:数据结构概述 1. 与408关联解析及本节内容介绍1 与408关联解析2 本节内容介绍 2. 逻辑结构与存储结构1 逻辑结构2 存储结构顺序存储链式存储 3 顺序存储与链式存储分析顺

dfs - 常见算法题总结_想当开心果哦的博客-爱代码爱编程

DFS 深度优先搜索( Depth First Search): 一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回

leetcode刷题day4----------------链表_hoooooope!的博客-爱代码爱编程

Leetcode刷题Day4----------------链表 1. 两两交换链表中的节点(24) 题目链接/文章讲解/视频讲解: https://programmercarl.com/0024.%E4%B8%A4%E

最大优先队列的实现(思路分析) [数据结构与算法]_96岁对抗java的博客-爱代码爱编程

最大优先队列的实现(思路分析) 我们要分析如何实现最大优先队列, 我们首先要明确我们是通过堆来实现最大优先队列的 添加元素的操作: 我们每次插入一个元素到堆中的最后一个位置, 然后使用一个上浮算法就可以了 就是让某