【Leetcode】889. 根据前序和后序遍历构造二叉树

文章目录

  • 题目
  • 思路
  • 代码
  • 结果

题目

题目链接
给定两个整数数组,preorder 和 postorder ,其中 preorder 是一个具有 无重复 值的二叉树的前序遍历,postorder 是同一棵树的后序遍历,重构并返回二叉树。
如果存在多个答案,您可以返回其中 任何 一个。

示例 1
在这里插入图片描述
输入:preorder = [1,2,4,5,3,6,7], postorder = [4,5,2,6,7,3,1]
输出:[1,2,3,4,5,6,7]

示例 2:
输入: preorder = [1], postorder = [1]
输出: [1]

提示

  • 1 <= preorder.length <= 30
  • 1 <= preorder[i] <= preorder.length
  • preorder 中所有值都 不同
  • postorder.length == preorder.length
  • 1 <= postorder[i] <= postorder.length
  • postorder 中所有值都 不同
  • 保证 preorder 和 postorder 是同一棵二叉树的前序遍历和后序遍历

思路

考虑到二叉树的前序遍历与后序遍历的特性,我们知道前序遍历的第一个元素 preorder[0] 与后序遍历的最后一个元素 postorder[n-1] 都对应着二叉树的根节点。获取了根节点后,我们需要将根节点的左子树和右子树区分开来,这里有两种情况需要考虑:

  1. 若原二叉树的根节点的左子树不为空,则 preorder[1] 对应着左子树的根节点;
  2. 若原二叉树的根节点的左子树为空,则 preorder[1] 对应着右子树的根节点。

对于上述两种情况,我们无法直接区分出 preorder[1] 到底是哪一种情况。但对于第二种情况,我们可以将原二叉树的右子树移到左子树,这样得到的二叉树的前序遍历数组与后序遍历数组与原二叉树相同。因为二叉树的节点值互不相同,所以我们可以在后序遍历数组中找到一个位置 k,使得 postorder[k] = preorder[1],这样左子树的节点数目为 k+1。基于此思路,我们可以对前序遍历数组和后序遍历数组进行分治处理,将前序遍历数组划分为根节点、左子树节点和右子树节点三个部分,后序遍历数组也划分为左子树节点、右子树节点和根节点三个部分。因此,问题被划分为:

  1. 根据左子树节点的前序遍历与后序遍历数组构造二叉树;
  2. 根据右子树节点的前序遍历与后序遍历数组构造二叉树。

当节点数目为 1 时,对应构造的二叉树只有一个节点。我们可以递归地对问题进行求解,从而得到构造的二叉树。

代码

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/class Solution {
public:TreeNode* constructFromPrePost(vector<int>& preorder, vector<int>& postorder) {int n = preorder.size();unordered_map<int, int> postMap;for (int i = 0; i < n; i++) {postMap[postorder[i]] = i;}return dfs(preorder, postorder, postMap, 0, n - 1, 0, n - 1);}TreeNode* dfs(vector<int>& preorder, vector<int>& postorder, unordered_map<int, int>& postMap, int preLeft, int preRight, int postLeft, int postRight) {if (preLeft > preRight) {return nullptr;}int leftCount = 0;if (preLeft < preRight) {leftCount = postMap[preorder[preLeft + 1]] - postLeft + 1;}return new TreeNode(preorder[preLeft],dfs(preorder, postorder, postMap, preLeft + 1, preLeft + leftCount, postLeft, postLeft + leftCount - 1),dfs(preorder, postorder, postMap, preLeft + leftCount + 1, preRight, postLeft + leftCount, postRight - 1));}
};

结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/484143.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

世界顶级名校计算机专业学习使用教材汇总

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-IauYk2cGjEyljid0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

臻图信息:让数字孪生“智慧”赋能防汛工作,面对应急事件更加从容

近年来随着极端天气的频发&#xff0c;对城市来说&#xff0c;高强度、连续性、时空分布不均匀的降水&#xff0c;容易发生城市内涝、交通堵塞、桥梁建筑损毁、河水倒灌等其他自然灾害。自然灾害主要包括地震、洪涝、台风、泥石流等&#xff0c;灾害的发生不仅对财产造成巨大损…

冷链物流追踪:Java与MySQL的协同实践

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

国际网络专线多少钱一年

国际网络专线作为企业扩展业务的重要通信渠道&#xff0c;已经成为许多企业不可或缺的选择。然而&#xff0c;对 于许多企业来说&#xff0c;选择一条稳定、高质量的国际网络专线&#xff0c;并不是一件容易的事情。那么&#xff0c;国际 网络专线到底多少钱一年呢&#xff1f;…

【动态规划】代码随想录算法训练营第三十八天 |基础知识,509.斐波那契数,70.爬楼梯,746.使用最小花费爬楼梯(待补充)

基础知识&#xff1a; 题目分类大纲如下&#xff1a; 算法公开课 《代码随想录》算法视频公开课(opens new window)&#xff1a;动态规划理论基础(opens new window)&#xff0c;相信结合视频再看本篇题解&#xff0c;更有助于大家对本题的理解。 #什么是动态规划 动态规划…

Java之线程:线程的创建、实现、方法及现成的状态

线程基础 程序、进程、线程&#xff1f; 程序&#xff1a; ​ 程序是含有指令和代码的文件&#xff0c;被存储在磁盘或其他数据存储设备中&#xff0c;可以理解为程序是包含静态代码的文件。例如&#xff0c;浏览器软件&#xff0c;游戏软件等软件的安装目录和文件 进程&…

SQL注入漏洞解析

什么是SQL注入 原理&#xff1a; SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严&#xff0c;攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句&#xff0c;在管理员不知情的情况下实现非法操作&#xff0c;以此来实现欺骗数据库服…

在vue3中使用canvas实现雨滴效果

在vue3中使用canvas实现雨滴效果 这是封装的一个组件DotAndRain&#xff08; &#xff09; <script setup> import { ref, onMounted } from "vue"; import { onUnmounted } from "vue";let animationFrameId null;const el ref(null); let canv…

⭐北邮复试刷题LCR 052. 递增顺序搜索树__DFS (力扣119经典题变种挑战)

LCR 052. 递增顺序搜索树 给你一棵二叉搜索树&#xff0c;请 按中序遍历 将其重新排列为一棵递增顺序搜索树&#xff0c;使树中最左边的节点成为树的根节点&#xff0c;并且每个节点没有左子节点&#xff0c;只有一个右子节点。 示例 1&#xff1a; 输入&#xff1a;root [5,…

论文学习 BioNeRF: Biologically Plausible Neural Radiance Fields for View Synthesis

论文学习 BioNeRF: Biologically Plausible Neural Radiance Fields for View Synthesis 前言简介NeRF介绍BioNeRF位置编码提取感知过滤记忆更新纹理推断损失函数 量化验证总结 前言 虽然我不应该再看NeRF相关的东西了&#xff0c;但是我还是觉得这个论文的题目很有意思&#…

一文穿透线程池,从此吊打面试官

目录 一、什么是线程池&#xff1f; 为什么要使用它&#xff1f; 二、什么是Executor框架&#xff1f; 三、什么是阻塞队列&#xff1f;如何使用阻塞队列来实现生产者-消费者模型&#xff1f; 四、常见线程池的快捷创建方式 五、为什么不建议使用 Executors静态工厂构建线…

六、回归与聚类算法 - 欠拟合和过拟合

目录 1、定义 2、原因及解决方法 2.1 正则化 线性回归欠拟合与过拟合线性回归的改进 - 岭回归分类算法&#xff1a;逻辑回归模型保存与加载无监督学习&#xff1a;K-means算法 1、定义 2、原因及解决方法 2.1 正则化