106.从中序与后序遍历序列构造二叉树

news2025/1/14 18:33:24

力扣题目链接(opens new window)

根据一棵树的中序遍历与后序遍历构造二叉树。

注意: 你可以假设树中没有重复的元素。

例如,给出

  • 中序遍历 inorder = [9,3,15,20,7]
  • 后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树:

106. 从中序与后序遍历序列构造二叉树1

class Solution {
public:
    TreeNode* dfs(vector<int>& inorder, vector<int>& postorder){
        if(postorder.size() == 0) return nullptr;
        int tmp = postorder.back();
        TreeNode* root = new TreeNode(tmp);
        if(postorder.size() == 1) return root;
        //确定分割点
        int index;
        for(index = 0;index < inorder.size();index++){
            if(inorder[index] == tmp) break;
        }
        //分割,左右中
        vector<int> leftin(inorder.begin(),inorder.begin()+index);
        vector<int> rightin(inorder.begin()+index+1,inorder.end());

        postorder.resize(postorder.size()-1);
        //左右后
        vector<int>leftpost(postorder.begin(),postorder.begin()+leftin.size());
        vector<int>rightpost(postorder.begin()+leftin.size(),postorder.end());
        root->left = dfs(leftin,leftpost);
        root->right = dfs(rightin,rightpost);
        return root;
    }
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        //也可以采用数组下标,来减少空间复杂度。
        if(inorder.size() == 0 || postorder.size() == 0) return nullptr;
        return dfs(inorder,postorder);
    }
};

//维护边界点(动态更新边界)。一般方法,可减少空间复杂度
class Solution {
public:
    TreeNode* dfs(vector<int>& inorder,int inbeg,int inend,vector<int>& postorder,int postbeg,int postend){
        if(postend == postbeg) return nullptr;
        int tmp = postorder[postend-1];
        TreeNode* root = new TreeNode(tmp);
        if(postend - postbeg == 1) return root;

        //分割点
        int index;
        for(index = inbeg;index < inend;index++){
            if(inorder[index] == tmp) break;
        }
        //中
        int leftinbeg = inbeg;
        int leftinend = index;
        int rightinbeg = leftinend+1;
        int rightinend = inend;
        //后
        int leftpostbeg = postbeg;
        int leftpostend = postbeg+leftinend-leftinbeg;
        int rightpostbeg = leftpostend;
        int rightpostend = postend-1;
        root->left = dfs(inorder,leftinbeg,leftinend,postorder,leftpostbeg,leftpostend);
        root->right = dfs(inorder,rightinbeg,rightinend,postorder,rightpostbeg,rightpostend);
        return root;
    }
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        if(inorder.size() == 0 || postorder.size() == 0) return nullptr;
        return dfs(inorder,0,inorder.size(),postorder,0,postorder.size());
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

堆排序算法---C语言实现(超详细解析!!!!)

目录 一、前言 二、堆排序 &#x1f34e;方法一&#xff08;自己写一个堆&#xff0c;在进行排序&#xff09; &#x1f4a6;时间复杂度分析 &#x1f350;方法二&#xff08;直接在数组上建堆&#xff09; &#x1f4a6;向上调整建堆 &#x1f4a6;向下调整建堆 &a…

2024级199管理类联考之数学基础(上篇)

管理类考试介绍 管理综合200分,时间3小时 数学&#xff1a;75分/25题,是拉开差距的核心模块 问题求解题&#xff1a;15个,5选一条件充分性判断&#xff1a;10个,结合两个条件选择答案 条件一充分,条件二不充分&#xff1a;A条件一不充分,条件二充分&#xff1a;B条件一充分,条…

set和map的封装

介绍 set和map的底层都是红黑树,所以我们可以在自己实现的红黑树(简易版)的基础上,进行封装,成为简易的set和map 红黑树代码 #pragma once#include <iostream> #include <vector> #include <string> #include <queue> #include <cassert> #inc…

redis的简单使用

文章目录 环境安装与配置redis发布-订阅相关命令redis发布-订阅的客户端编程redis的订阅发布的例子 环境安装与配置 sudo apt-get install redis-server # ubuntu命令安装redis服务ubuntu通过上面命令安装完redis&#xff0c;会自动启动redis服务&#xff0c;通过ps命令确认&a…

python中dir()和help()的作用

在 Python 中&#xff0c;dir() 和 help() 是两个常用的内置函数&#xff0c;用于获取对象的属性和方法信息以及提供帮助文档。 dir(object) 函数返回一个包含对象 object 的属性和方法名称的列表。如果没有提供参数&#xff0c;则返回当前作用域内的所有名称。例如&#xff0…

分支定界、分支切割、分支定价的区别

目录 1.从原理的角度 &#xff08;1&#xff09;分支定界&#xff1a; &#xff08;2&#xff09;分支切割&#xff1a; &#xff08;3&#xff09;分支定价&#xff1a; 2.从分支树的角度 &#xff08;1&#xff09;分支定界 &#xff08;2&#xff09;分支切割 &…

获取网卡上的IP、网关及DNS信息,获取最佳路由,遍历路由表中的条目(附源码)

VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&#xff09;https://blog.csdn.net/chenlycly/article/details/124272585C软件异常排查从入门到精通系列教程&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&a…

【数组及指针经典笔试题解析】

1.数组和指针笔试题 题目1 int main(){int a[5] { 1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5};int * ptr (int * )(&a 1);printf("%d&#xff0c;%d"&#xff0c;*(a 1)&#xff0c;*(ptr - 1));return 0;}图文解析&#xff1a; int * ptr …

【数据结构】堆的应用-----TopK问题

目录 一、前言 二、Top-k问题 &#x1f4a6;解法一&#xff1a;暴力排序 &#x1f4a6;解法二&#xff1a;建立N个数的堆 &#x1f4a6;解法三&#xff1a;建立K个数的堆&#xff08;最优解&#xff09; 三、完整代码和视图 四、共勉 一、前言 在之前的文章中&#xff…

SpringCloudGateway实现数字签名与URL动态加密

文章目录 对称加密非对称加密什么是数字签名HTTPS与CA⭐Gateway网关的过滤器链如何对自己的路径传输设定一个数字签名&#xff1f;前端获取RSA公钥发送加密后对称密钥后端接收当前会话对称密钥并保存前端发送AES加密请求验证请求 如何实现URL的动态加密&#xff1f; 再网络传递…

HTML开篇之安装VSvode(用记事本编辑HTML)

文章目录 前端开篇开篇知识点讲解1.HTML 结构1.1认识 HTML 标签1.2HTML 文件基本结构1.3标签层次结构1.4快速生成代码框架1.5用记事本写HTML1.6前端开发工具1.7下载vscode 及使用教学 大家好&#xff0c;我是晓星航。今天为大家带来的是 HTML 相关的讲解&#xff01;&#x1f6…

凉鞋的 Unity 笔记 105. 第一个通识:编辑-测试 循环

105. 第一个通识&#xff1a;编辑-测试 循环 在这一篇&#xff0c;我们简单聊聊此教程中所涉及的一个非常重要的概念&#xff1a;循环。 我们在做任何事情都离不开某种循环&#xff0c;比如每天的 24 小时循环&#xff0c;一日三餐循环&#xff0c;清醒-睡觉循环。 在学习一…

在线OJ项目核心思路

文章目录 在线OJ项目核心思路1. 项目介绍2.预备知识理解多进程编程为啥采用多进程而不使用多线程?标准输入&标准输出&标准错误 3.项目实现题目API实现相关实体类定义新增/修改题目获取题目列表 编译运行编译运行流程 4.统一功能处理 在线OJ项目核心思路 1. 项目介绍 …

【每日一题】买卖股票的最佳时机 III

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;动态规划 写在最后 Tag 【动态规划】【数组】【2023-10-03】 题目来源 123. 买卖股票的最佳时机 III 题目解读 有一个表示股票价格的数组&#xff0c;你需要计算出在最多可以完成两笔交易的前提下可获得的最大收益&a…

什么样的枕头可以让睡眠更舒适——四个月的反复试验结果

如何提高睡眠质量&#xff0c;我们先从睡眠中的呼吸质量谈起&#xff0c;这里面有大量的数据和记录&#xff0c;我后续会整理我这七八年来积累的所有睡眠质量数据进行分析汇总和处理。 几个月前我在看我的华为手表监控的睡眠数据时看到了关于睡眠中呼吸质量的数据&#xff0c;最…

1.6 计算机网络的性能

思维导图&#xff1a; 1.6.1 计算机网络的性能指标 前言&#xff1a; 我的理解&#xff1a; 这段前言主要介绍了关于计算机网络性能的两个方面的讨论。首先&#xff0c;计算机网络的性能可以通过一些重要的性能指标来衡量。但除了这些指标之外&#xff0c;还有一些非性能特征…

【强化算法专题一】双指针算法

【强化算法专题一】双指针算法 1.双指针算法--移动零2.双指针算法--复写零3.双指针算法--快乐数4.双指针算法--盛水最多的容器5.双指针算法--有效三角形的个数6.双指针算法--和为s的两个数7.双指针算法--三数之和8.双指针算法--四数之和 1.双指针算法–移动零 算法原理解析----…

BIT-6自定义类型和动态内存管理(11000字详解)

一&#xff1a;自定义类型 1.1&#xff1a;结构体 在生活中&#xff0c;基本数据类型可以描述绝大多数的物体&#xff0c;比如说名字&#xff0c;身高&#xff0c;体重&#xff0c;但是还有一部分物体还不足够被描述&#xff0c;比如说我们该如何完整的描述一本书呢&#xff…

VSCode安装图文详解教程

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 教程说明 本教程旨在详细介绍VSCode的安装过程及其注意事项。 下载VSCode 请在官方网站 https://code.visualstudio.com/ 下载https://code.visualstudio.com/至本地&…

Android学习之路(18) 数据存储与访问

文件存储读写 1.Android文件的操作模式 学过Java的同学都知道&#xff0c;我们新建文件&#xff0c;然后就可以写入数据了&#xff0c;但是Android却不一样&#xff0c;因为Android是 基于Linux的&#xff0c;我们在读写文件的时候&#xff0c;还需加上文件的操作模式&#x…