AC 剑指 Offer 07. 重建二叉树

简介: AC 剑指 Offer 07. 重建二叉树

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

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

示例 1:

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

/**
     * @Title: buildTree
     * @Description: 递归
     * @author: itbird
     * @date 2022年3月15日 下午3:59:16
     * @param preorder
     * @param inorder
     * @return TreeNode 时间复杂度: O(N) 空间复杂度: O(N)
     */

    int[] preorder; // 保存的前序遍历数据,用于过程中查找根节点
    HashMap<Integer, Integer> map = new HashMap<>(); // 保存中序遍历结果,key为节点值,value为位置

    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 buildMyTree(0, 0, inorder.length - 1);
    }

    private TreeNode buildMyTree(int root, int left, int right) {
        if (left > right) {
            // 相等的话就是自己
            return null;
        }

        // 构建根节点
        TreeNode node = new TreeNode(preorder[root]);
        // 获取在中序遍历中根节点所在索引,以方便获取左子树的数量
        int idx = map.get(preorder[root]);
        // 左子树的根的索引为先序中的根节点+1
        // 递归左子树的左边界为原来的中序in_left
        // 递归左子树的右边界为中序中的根节点索引-1
        node.left = buildMyTree(root + 1, left, idx - 1);
        // 右子树的根的索引为先序中的 当前根位置 + 左子树的数量 + 1
        // 递归右子树的左边界为中序中当前根节点+1
        // 递归右子树的右边界为中序中原来右子树的边界
        node.right = buildMyTree(root + idx - left + 1, idx + 1, right);
        return node;
    }
目录
相关文章
|
小程序 UED 开发者
小程序如何监听页面的滚动事件
小程序如何监听页面的滚动事件
651 0
|
Kubernetes 调度 Docker
Kubernetes高可用集群二进制部署(五)kubelet、kube-proxy、Calico、CoreDNS
Kubernetes高可用集群二进制部署(五)kubelet、kube-proxy、Calico、CoreDNS
Kubernetes高可用集群二进制部署(五)kubelet、kube-proxy、Calico、CoreDNS
|
Oracle 安全 关系型数据库
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
VideoGrain:零样本多粒度视频编辑神器,用AI完成换装改场景,精准控制每一帧!
VideoGrain 是悉尼科技大学和浙江大学推出的零样本多粒度视频编辑框架,基于调节时空交叉注意力和自注意力机制,实现类别级、实例级和部件级的精细视频修改,保持时间一致性,显著优于现有方法。
214 0
VideoGrain:零样本多粒度视频编辑神器,用AI完成换装改场景,精准控制每一帧!
|
8月前
|
关系型数据库 MySQL 数据库
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
随着数据量增长和业务扩展,单个数据库难以满足需求,需调整为集群模式以实现负载均衡和读写分离。MySQL主从复制是常见的高可用架构,通过binlog日志同步数据,确保主从数据一致性。本文详细介绍MySQL主从复制原理及配置步骤,包括一主二从集群的搭建过程,帮助读者实现稳定可靠的数据库高可用架构。
417 9
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
|
12月前
|
Linux
Linux Crontab 查看定时任务启动没
【10月更文挑战第20天】在Linux系统中,crontab用于设置周期性执行的任务。查看当前用户的Crontab任务列表,使用`crontab -l`;查看所有用户任务,使用`sudo crontab -l`或指定用户`sudo crontab -u username -l`。
549 5
|
12月前
|
算法 C++
【算法】DP背包问题(C/C++)
【算法】DP背包问题(C/C++)
|
机器学习/深度学习 算法 数据挖掘
从零到精通:Scikit-learn在手,数据分析与机器学习模型评估不再难!
【7月更文挑战第25天】在数据科学中,模型评估是理解模型泛化能力的关键。对新手来说,众多评估指标可能令人困惑,但Scikit-learn简化了这一过程。
216 2
|
数据挖掘
2022亚太数学杯数学建模竞赛C题(思路、程序......)
2022亚太数学杯数学建模竞赛C题(思路、程序......)
517 0
|
前端开发 JavaScript 算法
程序技术好文:高德地图经纬度坐标拾取工具
程序技术好文:高德地图经纬度坐标拾取工具
669 0