14. 构造二叉树

title: 构造二叉树 , 看这一篇就足够!
思想:构造整棵树 = 根节点 + 构造左子树 + 构造右子树

📃 题目一描述

题目链接:从中序与后序遍历构造二叉树

14. 构造二叉树

🔔 解题思路

必须明确条件: 给出一个数组的值中,是没有重复的数字的,即没用节点的数值是相同的!

画图分析:(图来自dong哥)

14. 构造二叉树

可以很明确得知:后续遍历数组中postEnd就是中点的值,通过中点的值我们就可以在中序遍历数组中找到中点的位置,从而分割出左子树,右子树,递归就可以完成构建;

class Solution {
public:
    TreeNode* buildTree(vector& inorder, vector& postorder) {
        return build(inorder, 0, inorder.size() - 1, postorder, 0, postorder.size() - 1);
    }

    //都是不同的值组成,不存在"中"在左子树中出现的情况;
    TreeNode* build(vector& inorder, int inStart, int inEnd, vector& postorder, int postStart, int postEnd) {
        if (inStart > inEnd) return nullptr;

        int rootVal = postorder[postEnd];
        int size = 0;
        for (int i = inStart; i left = build(inorder, inStart, inStart + size - 1, postorder, postStart, postStart + size - 1);
        root->right = build(inorder, inStart + size + 1, inEnd, postorder, postStart + size, postEnd - 1);
        return root;
    }
};

📃 题目二描述

题目链接:从前序与中序遍历构造二叉树

14. 构造二叉树

🔔 解题思路

同上,依据图来写代码即可:

14. 构造二叉树
class Solution {
public:
    TreeNode* buildTree(vector& preorder, vector& inorder) {
        return build(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1);
    }

    TreeNode* build(vector& preorder, int preStart, int preEnd, vector& inorder, int inStart, int inEnd) {
        if (preStart > preEnd) return nullptr;

        int rootVal = preorder[preStart];
        int size = 0;
        for (int i = inStart; i left = build(preorder, preStart + 1, preStart + size, inorder, inStart, inStart + size - 1);
        root->right = build(preorder, preStart + size + 1, preEnd, inorder, inStart + size + 1, inEnd);
        return root;
    }
};

📃 题目三描述

题目链接:根据前序和后序遍历构造二叉树

14. 构造二叉树

🔔 解题思路

这道题与前两道题的不同之处: 通过前序和后序是无法确定唯一一颗二叉树的!

原因:看图

14. 构造二叉树

前序和后序只能确定中,无法确定左右的边界!可能压根就没有左指针或者右指针 例如: preorder = [1,2,3], postorder = [3,2,1],而下图两种树结构都满足;

14. 构造二叉树

理解: 我们假设前序遍历的第二个元素是左子树的根节点(左图),但实际上左子树有可能是空指针(右图),那么这个元素就应该是右子树的根节点。由于这里无法确切进行判断,所以导致了最终答案的不唯一。

这道题如何做: ①确定根节点,②将前序遍历数组中根节点后的下一位为左根节点(preStart + 1, 自己也快选定其他), ③在后序遍历数组中找到该左根节点的位置,从而分割左右子树;如图:

14. 构造二叉树

代码:

class Solution {
public:
    TreeNode* constructFromPrePost(vector& preorder, vector& postorder) {
        return build(preorder, 0, preorder.size() - 1, postorder, 0, postorder.size() - 1);
    }
    TreeNode* build(vector& preorder, int preStart, int preEnd, vector& postorder, int postStart, int postEnd) {
        if (preStart > preEnd) return nullptr;

        int rootVal = preorder[preStart];
        if (preStart == preEnd) return new TreeNode(rootVal);
        int leftRootVal = preorder[preStart + 1];
        int size = 0;
        for (int i = postStart; i left = build(preorder, preStart + 1, preStart + size + 1, postorder, postStart, postStart + size);
        root->right = build(preorder, preStart + size + 2, preEnd, postorder, postStart + size + 1, postEnd);
        return root;
    }
};

优化建议:以上三题,均是不重复数组,可以用空间换时间的想法: 可以采用哈希表记录 需要遍历的数组 对应的index, 这样在每次遍历的时候可以直接得到想要查询数的下标

📃 题目四描述(简单练手题)

题目链接:最大二叉树

14. 构造二叉树

14. 构造二叉树

🔔 解题思路

根据构造树的思想,依题目构造即可

class Solution {
public:
    TreeNode* constructMaximumBinaryTree(vector& nums) {
        return build(nums, 0, nums.size() - 1);
    }
    TreeNode* build(vector& nums, int start, int end) {
        if (start > end) return nullptr;

        int rootVal = INT_MIN;
        int index = 0;
        for (int i = start; i left = build(nums, start, index - 1);
        root->right = build(nums, index + 1, end);
        return root;
    }
};

Original: https://www.cnblogs.com/D-booker/p/16319675.html
Author: D-booker
Title: 14. 构造二叉树

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/713319/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 2022.32 物联网分层架构

    物联网技术的应用一般可划分为四层,分别感知层、网络层、平台层、应用层: 1、感知层 感知层通过传感技术,感知并采集物理世界的数据,建立人与物之间的沟通桥梁,主要由各种传感器以及传感…

    技术杂谈 2023年5月30日
    0109
  • 11-K8S部署普罗米修斯

    K8S-Kubernetes 集群部署 Prometheus 和 Grafana 1.实验环境 控制节点/master01 192.168.80.20 工作节点/node01 19…

    技术杂谈 2023年7月10日
    0112
  • ThreadLocal源码解析,内存泄露以及传递性

    我想ThreadLocal这东西,大家或多或少都了解过一点,我在接触ThreadLocal的时候,觉得这东西很神奇,在网上看了很多博客,也看了一些书,总觉得有一个坎跨不过去,所以对…

    技术杂谈 2023年7月25日
    078
  • 【docker】python: can’t open file ‘helloworld.py’: [Errno 13] Permission denied

    运行容器提示权限问题 docker run -v $PWD/myapp:/usr/src/myapp -w /usr/src/myapp python:3.5 python hel…

    技术杂谈 2023年7月24日
    099
  • OGRE Tutorials 1

    【 Guide to building OGRE】 1、Preparing the build environment You should now create a build …

    技术杂谈 2023年5月31日
    0120
  • 【主流技术】Spring Boot中的微信支付(小程序)

    前言 微信支付是企业级项目中经常使用到的功能,作为后端开发人员,完整地掌握该技术是十分有必要的。 logo 一、申请流程和步骤 图1-1 注册微信支付账号 获取微信小程序APPID…

    技术杂谈 2023年7月10日
    0155
  • mysql 内部函数

    1. group_concat 返回一个字符串结果,该结果由分组中的值连接组合而成。 函数语法: group_concat( [DISTINCT] 要连接的字段 [Order BY…

    技术杂谈 2023年7月25日
    085
  • 离线安装 Dapr

    Dapr 官方从 1.7 版本开始提供了离线安装Dapr 的支持。 Dapr CLI 工具和 自宿主模式安装可以参考以下几个链接: Dapr 离线安装 & 在线执行 dap…

    技术杂谈 2023年5月31日
    088
  • springboot应用中使用CommandLineRunner

    在springboot应用中,存在这样的使用场景,在springboot ioc容器创建好之后根据业务需求先执行一些操作,springboot提供了两个接口可以实现该功能: Com…

    技术杂谈 2023年7月11日
    098
  • Springboot优雅参数校验,统一响应,异常处理

    1.统一响应 (1)统一状态码首先定义一个状态码接口,所有状态码都需要实现它 public interface StatusCode { public int getCode();…

    技术杂谈 2023年7月24日
    072
  • CGContext 和 CIContext

    属于Core Graphics(使用Quartz 进行2D渲染,处理基于路径的绘图、抗锯齿渲染、渐变、图像、颜色管理、pdf文档等。 说白了就是2D绘图 渲染功能)框架. 我们平时…

    技术杂谈 2023年5月30日
    0102
  • Vue组件介绍

    #基本示例 Vue组件的定义: component (组件)中的data ,必须是个函数,这是因为 组件是需要复用的,每次的复用,都相当于创建了一个新的实例. 这种情况跟 类(ja…

    技术杂谈 2023年7月11日
    087
  • JavaWeb学习笔记

    站得高,看得远,从设计框架的角度出发去思考问题。 源码不能只看,一定要上手。 html语言是解释型语言,不是编译型,浏览器是容错的,写错了浏览器也会解析。 html页面中由一对标签…

    技术杂谈 2023年7月11日
    092
  • lambda表达式常用01

    1、 优化线程代码 以前我们使用线程可能是这么使用的: 使用lambda: 再次进行优化写法: 2.Arrays.sort 排序优化 在代码中,我们会使用Arrays.sort对数…

    技术杂谈 2023年7月24日
    0103
  • ConstraintLayout的用法

    <span class=”typ”>ConstraintLayout</span> 相对于 <span class=”typ”>Relative…

    技术杂谈 2023年5月31日
    0100
  • 技术管理进阶——空降Leader如何开展工作?

    原创不易,求分享、求一键三连 前几天有个粉丝咨询了一个的问题: 最近遇到一个 空降Leader,挺苦恼的:新Leader技术很厉害,但平时根本就不管我们,也不愿意了解业务,更像是一…

    技术杂谈 2023年6月1日
    089
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球