[ 二叉树 ] 中序和后序遍历确定二叉树

利用二叉树中序及先序遍历确定该二叉树的后序序列 利用二叉树中序及先序遍历确定该二叉树的后序序列与上一题不同的是,先序序列中第一个元素为当前根节点,在中序中找到该元素后,确定左子树个数n和右子树节点个数m,那么先序序列中根节点后n个为其左子树,接下来m个位其右子树,然后递归处理中序:BFDAEGC 先序:ABDFCEG#include<iostream>#include<string.h>using namespace s... 阅读详情

106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode) (leetcode-cn.com)

中序和后序遍历确定二叉树

递归

  • 明确:分治
  • 左闭右开切割
class Solution {
public:
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        // 构造返回值
        TreeNode* root = new TreeNode();

        // 空组返回
        if (postorder.empty()) return nullptr;

        // 寻找中序切割点, 也同样为根节点
        int cutPointValue = postorder[postorder.size() - 1];
        root->val = cutPointValue;

        // 如果只剩一个根结点直接返回即可
        if (postorder.size() == 1) return root;

        // 否则切割
        int inCutPoint = 0;
        for (; inCutPoint < inorder.size(); ++inCutPoint)
            if (cutPointValue == inorder[inCutPoint]) break;

        // 左闭右开原则
        vector<int> inLeft(inorder.begin(), inorder.begin() + inCutPoint);
        vector<int> inRight(inorder.begin() + inCutPoint + 1, inorder.end());

        int postCutPoint = inLeft.size();
        vector<int> postLeft(postorder.begin(), postorder.begin() + postCutPoint);
        vector<int> postRight(postorder.begin() + postCutPoint, postorder.end() - 1);

        root->left = buildTree(inLeft, postLeft);
        root->right = buildTree(inRight, postRight);

        return root;
    }
};
  • 空间优化 利用下标代替切割
  • 如果每次切割都创造新向量则会产生过多的空间开销
class Solution {
public:
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        return traversal(inorder, 0, inorder.size(), postorder, 0, postorder.size());
    }

    TreeNode* traversal(vector<int> &inorder, int inBegin, int inEnd,
        vector<int> &postOrder, int postBegin, int postEnd) {
        if (postBegin == postEnd) return nullptr;

        int rootValue = postOrder[postEnd - 1];
        TreeNode* root = new TreeNode(rootValue);

        if (postBegin == postEnd - 1) return root;

        int inCut = 0;
        for (; inCut < inEnd; ++inCut) {
            if (inorder[inCut] == rootValue) break;
        }
		
        // 传递下标代替切割
        int leftInBegin = inBegin;
        int leftInEnd = inCut;
        int rightInBegin = inCut + 1;
        int rightInEnd = inEnd;
        int leftPostBegin = postBegin;
        int leftPostEnd = postBegin + leftInEnd - leftInBegin;
        int rightPostBegin = leftPostEnd;
        int rightPostEnd = postEnd - 1;

        root->left = traversal(inorder, leftInBegin, leftInEnd, postOrder, leftPostBegin, leftPostEnd);
        root->right = traversal(inorder, rightInBegin, rightInEnd, postOrder, rightPostBegin, rightPostEnd);
        return root;
    }
};
根据二叉树的前序(后序)和 中序确定一个二叉树并以层次遍历输出 这里只给出后序和中序确定二叉树的方法,前序和中序是差不多的; 先给出代码:   #include&lt;iostream&gt; #include&lt;algorithm&gt; #include&lt;cmath&gt; #include&lt;cstring&gt; #include&lt;cstdlib&gt; #include&lt;cstdio&gt; #include&lt;... 阅读详情

相关推荐

UE5 C++教程(一、基本结构)

虚幻API由三块组成,分别是Runtime,Developer utilitiew,functionality for the Editor,大多数游戏性编程只使用运行时模块,最常见的三个是Corn、CornUObject和Engine。

skycol的博客 1万+

二叉树的遍历-由中序和后序遍历序列确定一颗二叉树

概述 中序遍历的结果和后序遍历的结果可以确定一颗二叉树 方法 后序序列可以知道根结点和子树的子节点;中序序列可以知道根结点(子树的子节点)的左子树有哪些元素,右子树有哪些元素 推演 中序遍历序列和后序遍历序列确定树 中序序列:cbedahgijf 后序序列:cedbhjigfa 案例 Given the postorder and inorder traversal sequences 给出后序和中序序列 you are supposed to output th...

eeeemon的博客 8017

Visual Studio Git 使用指南

Visual Studio 2022深度集成了Git功能,提供了直观的图形界面管理源代码。本文详细介绍了VS中Git的使用方法:从环境准备、克隆/创建仓库开始,重点讲解了"Git更改"窗口的日常操作,包括查看修改、暂存文件、提交推送等。同时涵盖了分支管理、查看历史、解决冲突等核心功能,以及储藏、重置等高级操作。文章还提供了实用技巧,如提交规范、频繁提交等最佳实践。VS的Git集成覆盖了日常开发需求,图形界面与命令行可互补使用,适合各层次开发者高效管理代码版本。

guigenyi的专栏 1570

根据二叉树的先序、中序、后序遍历构建二叉树-图文详解

引言:根据一颗二叉树,可以得出他的先序、中序、后序三种遍历方式,那么如果我们知道了他的前序、中序遍历,如何绘制出这颗二叉树呢? 1、二叉树三种遍历方式的特性 特性A,对于前序遍历,第⼀个肯定是根节点; 特性B,对于后序遍历,最后⼀个肯定是根节点; 特性C,利⽤前序或后序遍历,确定根节点,在中序遍历中,根节点的两边就可以分出左⼦树和右⼦树; 特性D,对左⼦树和右⼦树分别做前⾯3点的分析和拆分,相当于做递归,我们就可以重建出完整的⼆叉树; 2、根据特性构建二叉树 例:已知一颗二叉树的前序遍历和中序遍历.

梦想不会灭 1万+

codemirror6 制作markdown编辑器(源码模式)

总体上感觉能用,但是不怎么友好,官方文档有点散乱,而且关键字高亮功能是独立出去的,去官方文档找半天,也没找到怎么改。EditorView.theme可以往EditorView模块中修改CSS的样式,从而影响编辑器的样式展示。"### 测试\n\n```javascript\nlet x = 'y'\n```"这个插件中的markdown语法的高亮样式。//这里指定markdown中代码块使用的解析扩展。开头的class样式,并且还需要在选择器前面添加。//markdown语言解析扩展。

qq_43203949的博客 1783

本地通知与健康数据的隐私保护方案

随着移动健康(mHealth)应用的普及,本地通知与健康数据的结合为用户提供了更加个性化的健康管理体验。然而,这种便利性也带来了严峻的隐私保护挑战。本文旨在探讨如何在移动应用中实现本地通知功能的同时,确保用户健康数据的隐私安全。本地通知与健康数据结合的技术架构隐私保护的核心技术方案具体算法实现与数学模型实际应用案例分析本文首先介绍背景知识和核心概念,然后深入探讨隐私保护的技术方案,包括算法原理和数学模型。接着提供实际代码实现和应用场景分析,最后讨论未来发展趋势和挑战。

移动开发前沿的博客 1309

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

一、题目描述 根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 中序遍历 inorder =[9,3,15,20,7] 后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树: 二、思路 思路来源于图解构造二叉树之中序+后序,画得图是真心棒 前提 解决此问题的关键在于要很熟悉树的各种遍历次序代表的什么,最好能够将图画出来。本题解带你先进行中序遍历和后续遍历二叉树,然后再根据遍历结果将二叉树进行还原。 首先,来.

阳阳的博客 3595

YOLOv13有效涨点改进专栏目录 | 本专栏持续更新500+篇内容 | 包含各种卷积、主干网络、各种注意力机制、检测头、损失函数、小目标检测改进、二次创新模块、独家创新等几百种创新点改进

《YOLOv13改进专栏重磅更新》推出500+创新改进方案,涵盖卷积、主干网络、注意力机制、检测头等核心模块优化。专栏提供完整项目代码及答疑服务,包含YOLOv13网络结构解析、环境配置、模型训练全流程指导。内容分为八大模块:卷积优化、注意力机制、细节涨点、主干网络改进、特征融合、检测头优化、小目标检测及Mamba联合改进等,支持多种创新点组合应用,助力科研论文发表。现开放限时订阅,提供试读章节和详细技术解析。

Ai缝合怪、助力小伙伴高效发论文 3385

中序和后序(前序和中序)序列确定一颗二叉树

中序遍历的结果和后序遍历的结果可以确定一颗二叉树或者前序遍历和中序遍历但是前序后和后序无法确定一颗二叉树由先序序列和后序序列不能唯一确定一棵二叉树,因无法确定左右子树两部分。例如俩二叉树前序:1 2 3 后序:3 2 1。

weixin_50809457的博客 2720

解决 maven编译项目-Fatal error compiling: 无效的目标发行版: 21 -> [Help 1]

惊奇的发现,maven没有用环境变量中设置好的JAVA_HOME目录,至此发现错误原因,原来执行java -version默认使用系统环境变量JAVA_HOME,而maven优先使用了windows的用户变量JAVA_HOME(这里之前忘记修改,仍然指向java8路径),修改用户变量JAVA_HOME指向java21或删除该用户变量JAVA_HOME(如无它用)后即可。打开maven包所在的目录,在maven的配置文件 mvn.cmd 文件中,设置java_home的目录。

litlit023的专栏 1799

Cilium动手实验室: 精通之旅---1.Getting Started with Cilium

我们需要在 HTTP 层的第 7 层实施策略,以限制允许 tiefighter 调用的确切 API,以及不允许调用哪些 API。上仅需要的 API 资源的访问,从而为微服务之间的通信实施“最低权限”安全方法。船只上进行匹配,因此我们需要在该标签上进行匹配,此外,我们必须确保来自带有标签。为了模拟我们的连接测试,我们将使用 curl 执行简单的 API 调用。在我们立即开始更改策略之前,让我们考虑一下相应的网络策略应该是什么样子。的规则,该规则将通过 L3-L4 策略对死星的访问限制为仅帝国船只。

Q先生 1126

【二叉树】如何通过(前序|后序)和中序确定一个二叉树

但是如果只有前序和后序就无法确定一个唯一的二叉树,因为无法确定根的左右子树。当题目为 “通过后序和中序得出二叉树” 时,前序:A B C D E F G H I。中序:B D C A E H G I F。带入中序的左根右口诀,可以得出。同样根据前序根左右,可以确定。是EHGIF的根结点,结点无左子树,右子树为。(如下图),至此完成。

葫芦娃子救我的博客 2581

单智能体篇:Prompt工程艺术

模型在接收到 Prompt 时会自动扮演“角色”,角色定义的好坏直接影响智能体输出的风格和专业性。角色定义的重要性让智能体具备明确身份,例如“你是一位专业理财顾问”或“你是一个幽默的文案创作助手”。角色限定了模型知识输出的范围,使回答更专业、更贴合预期。实战示例模糊Prompt给我一些投资建议。你可以投资股票或者基金。优化Prompt你是一位具有10年经验的专业理财顾问,请给我针对30岁男性,年收入20万,风险偏中等的投资组合建议。

公众号:AI前沿侦探 1304

二叉树的前(先)序中序和后序遍历 以及如何通过两个序列确定唯一二叉树

文章目录三种遍历前(先)序遍历。中序遍历。后序遍历。举几个例子两个序列确定一个二叉树 最近做了一套卷子,考了二叉树的遍历。有点生疏,回顾一下,如何通过两种遍历序列确定一颗二叉树。 三种遍历 先中后表示对根节点访问的先后顺序,对子树都是先左后右。 前(先)序遍历。 遍历顺序是 根节点 -&gt;左子树(节点)-&gt;右子树(节点) 可以理解成 1 存在根节点,访问根节点 2 存在左子树或节点的...

熊仙森滴Blog 2万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

swust oj 983和984 利用二叉树中序及后序遍历确定该二叉树的先序序列

思路: 1.983:当前树的后续遍历的最后一个元素肯定是根节点。中序遍历中根节点左边是左子树,右边是右子树,递归处理。 2.984:当前树的先续遍历的第一个元素肯定是根节点。中序遍历中根节点左边是左子树,右边是右子树,递归处理。 3.两种方法进行顺序相反 983: 利用二叉树中序及后序遍历确定该二叉树的先序序列 题目描述 已知二叉树的中序和先序遍历可以唯一确定后序遍历、已知中序和后序遍历可以唯一确定先序遍历,但已知先序和后序,却不一定能唯一确定中序遍历。现要求根据输入的中序遍历结果及后序遍历结果,要求输出其

weixin_45733897的博客 2030

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

根据先序和中序遍历确定二叉树的后序遍历

分析: 只要清楚了先序中序后序的含义 先序是中左右 中序是左中右 后序是左右中 那么我们只要在递归的: 在先序列里取第一个元素 这个元素就是根元素 然后在中序列里找到根 根的左边(左子树)作为下一次递归的(左)中序列 右边(右子树)作为下一次递归的(右)中序列 然后根据左右边的个数在先序列里截取作为左右的先xulie 先进入右递归 再进入左递归 然后输出根的值 # Determining the ...

沃沃头同学的博客 1221

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

利用二叉树中序及先序(后序)遍历确定该二叉树的后序(先序)序列

利用二叉树中序及先序遍历确定该二叉树的后序序列: suwst oj#984 1.原理很简单先根据先序第一个节点为根节点的性质查找根节点在中序遍历中的位置以便确定中序遍历左右子树的节点个数。 2.根据左右子树节点个数确定先序遍历中左右子树 的遍历情况。 3.重复上面步骤。 附代码: #include <iostream> #include <string> using nam...

chineseherofeng的博客 1230

SWUST OJ983: 利用二叉树中序及后序遍历确定该二叉树的先序序列

983: 利用二叉树中序及后序遍历确定该二叉树的先序序列 题目描述 已知二叉树的中序和先序遍历可以唯一确定后序遍历、已知中序和后序遍历可以唯一确定先序遍历,但已知先序和后序,却不一定能唯一确定中序遍历。现要求根据输入的中序遍历结果及后序遍历结果,要求输出其先序遍历结果。 输入 第一行为中序序列 第二行为后续序列 输出 输出为遍历二叉树得到的先序序列 样例输入 BFDAEGC FDBGECA 样例输出 ABDFCEG 思路: 后序遍历输出的最后一个值是树的根节点,已知根节点,可以在中序遍历中找到这个根节点的左

xiaodaitongxue的博客 1937

先序+后序遍历不能确定一棵二叉树

如上图两个树,先序遍历都为ab,后序遍历都为ba。 一般来说,如果二叉树中存在度为1的节点,则根据 先序 和 后序 遍历不能唯一确定该二叉树。 leetcode 106. 从中序与后序遍历序列构造二叉树 参考自: https://zhidao.baidu.com/question/530938551.html ...

aaqian1的博客 854

利用二叉树中序及后序遍历确定该二叉树的先序序列

利用二叉树中序及后序遍历确定该二叉树的先序序列中序:BFDAEGC 后序:FDBGECA后序遍历是先访问右节点,然后访问左节点,最后访问根节点中序遍历是先访问左节点,然后访问根节点,最后访问右节点    可以知道后序输出中的最后一个字符A即为该二叉树的根节点,然后在中序遍历中找到该节点A的位置,其左边BFD为A的左子树,其右边EGC为A的右子树    在中序中找到A左子树节点的个数和右子树节点的个...

umalaka的博客 988

两种写法解决利用二叉树中序及后序遍历确定该二叉树的先序序列问题

利用二叉树中序及后序遍历确定该二叉树的先序序列 中序遍历:DCBFEGAH 后序遍历:DCFGEBHA 根据中序遍历和后续遍历的性质: 1.它们都是先遍历左子树。 2.后序遍历中从右到左依次为对应子树的根结点。 3.中序遍历中若我们找到一个根节点,那么在一个范围内,根节点的左边为左子树,右边为右子树。 过程如下: 1.DCBFEG AH DCFGEB HA, A为根节点,在中序遍历中它的左边即为左子树(6个节点),右边为右子树(1个节点);在后序遍历中我们即可根据左右子树的节点个数确定后序遍历中的左右子

麦片不加糖 750

【数据结构笔记10】二叉树的先序、中序、后序遍历,中序遍历的堆栈/非递归遍历算法,层序遍历,确定一个二叉树,树的同构

就二叉树的基础遍历方法展开,最后落到树的同构检验实现上。

记录学习痕迹的公众号:Piper蛋窝 1291

确定一棵二叉树!| LeetCode 106. 从中序与后序遍历序列构造二叉树

postorder = [9,15,7,20] 左子树大小为1,则[9]为左子树,剩下为右子树[15,7,20]//先从后序确定根节点,再从中序区分左和右,然后从后序得到同样的左右子树,结合右子树中序遍历[15,20,7]和后序遍历[15,7,20],右子树的根节点为20。//利用根节点的索引将中序结果分为左子树和右子树(除开根节点)//再利用左右子树的节点个数对后序结果进行左右划分。结合左子树中序遍历[9]和后序遍历[9],只有一个节点[9]为参照,左边[9]为左子树,右边[15,20,7]为右子树。

2302_76739243的博客 1005

SWUST OJ 983: 利用二叉树中序及后序遍历确定该二叉树的先序序列

题目描述 知二叉树的中序和先序遍历可以唯一确定后序遍历、已知中序和后序遍历可以唯一确定先序遍历,但已知先序和后序,却不一定能唯一确定中序遍历。现要求根据输入的中序遍历结果及后序遍历结果,要求输出其先序遍历结果。 输入 第一行为中序序列 第二行为后续序列 输出 输出为遍历二叉树得到的先序序列

无奈清风吹过的博客 971
上一篇: [ 二叉树 ] 完全二叉树结点个数
下一篇: [ 二叉树 ] 最大二叉树
Kalv1n
博客等级 码龄7年 35粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值