【算法】中序与后序遍历序列构造二叉树(二叉树、递归)

2023-11-01

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

根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出中序遍历 inorder = [9,3,15,20,7],后序遍历 postorder = [9,15,7,20,3]返回如下的二叉树:

     3
    / \
    9 20
      / \
     15   7
 class Solution {
     public TreeNode buildTree(int[] inorder, int[] postorder) {
         return traversal(inorder, 0, inorder.length, postorder, 0, postorder.length);
    }
   
     public TreeNode traversal(int[] inorder, int inLeft, int inRight, int[] postorder,  intpoLeft, int poRight){
         // 上来先判断是否是空树
         if(poRight - poLeft == 0)//此处必须使用Right-Left,而不是inorder.length!length始终没变,会死循环。
             return null;
         // 找到新的中间节点
         int rootValue = postorder[poRight - 1];
         TreeNode root = new TreeNode(rootValue);
         // 如果只有一个直接返回当前节点,无需后续找切点和切割
         if(poRight - poLeft == 1)//必须Right-Left
             return root;
         // 找中序遍历的切点
         int divisionPoint = inLeft;
         for(int i = inLeft; i < inRight; i++){
             if(inorder[i] == rootValue){
                 divisionPoint = i;
                 break;
            }
        }
         // root.left = traversal(inorder, inLeft, divisionPoint, postorder, poLeft, divisionPoint/*不可直接使用divisionPoint,后续的分割不取决于divisionPoint,而是中序的子串长度,因而使用加和的形式poLeft + (divisionPoint - inLeft) */);//左中,左后
         // root.right = traversal(inorder, divisionPoint + 1, inRight, postorder, divisionPoint, poRight - 1);
         root.left = traversal(inorder, inLeft, divisionPoint, postorder, poLeft/*不可使用inLeft ,为什么:从图中可以看出,分过一次之后的右子树的中序与后续的左起始index已经不再一致了*/, poLeft +(divisionPoint - inLeft));//左中,左后
         root.right = traversal(inorder, divisionPoint + 1, inRight, postorder, poLeft +(divisionPoint - inLeft), poRight - 1);
         return root;
    }
 }

105. 从前序与中序遍历序列构造二叉树

 class Solution {
     public TreeNode buildTree(int[] preorder, int[] inorder) {
         return traversal(inorder, 0, inorder.length, preorder, 0, inorder.length);
    }
     
     public TreeNode traversal(int[] inorder, int inLeft, int inRight, int[] preorder, intpreLeft, int preRight){
         // 先判断是否为空(有两种为空的情况(错,只有一种情况,没有节点的空子节点这种情况)),为空说明为则无需后续新建节点,以及分割
         if(inRight - inLeft == 0)
             return null;
         // 有节点则直接从前序取节点即可(不要犹豫^_^)
         int rootValue = preorder[preLeft];
         TreeNode root = new TreeNode(rootValue);
 ​
         if(inRight - inLeft == 1)
             return root;
 //寻找中间节点
         int rootindex = inLeft;
         for(int i = inLeft; i < inRight; i++){
             if(inorder[i] == rootValue){
                 rootindex = i;
                 break;
            }
        }
 //分割
         root.left = traversal(inorder, inLeft, rootindex, preorder, preLeft + 1, (rootindex- inLeft) + preLeft + 1);
         root.right = traversal(inorder, rootindex + 1, inRight, preorder, (rootindex -inLeft) + preLeft + 1, preRight);
         return root;
    }
 }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【算法】中序与后序遍历序列构造二叉树(二叉树、递归) 的相关文章

  • 快速排序的递归实现和非递归实现

    一 快速排序的递归实现 快速排序的思想是每次找到一个元素的位置 再在以这个元素分隔的两个子范围中分别再各自确定一个元素的位置 子子范围也是如此操作 当某个子范围只有一个元素或者没有元素时 便不再做任何操作 这是一个递归过程 递归退出的边界就
  • 二叉树深度和高度_二叉树的高度和深度

    二叉树深度和高度 In this tutorial we will learn how to find height and depth of binary tree with program implementation in C It
  • 数据结构——二叉树 增加、删除、查询

    二叉树系统 public class BinarySystem public static void main String args BinaryDomain root null 定义头结点 new BinaryAction manage
  • 树的算法总结

    写在前言 感谢代码随想录博主 博主是c 代码 此刷题总结是java代码 下文是我学习博主刷题记录的笔记 递归三部曲 找终止条件 什么时候递归到头了 思考返回值 每一级递归应该向上返回什么信息 单步操作应该怎么写 因为递归就是大量的调用自身的
  • 线索化二叉树,前序、中序以及后序遍历代码

    文章目录 节点代码 前 中 后序线索化以及遍历代码 测试代码 节点代码 class Node int value Node left 左子树 Node right 右子树 Node pre 父节点 左节点属性 若值为0 其指向的是子树 若值
  • 数据结构 ——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现

    一 基本概念 每个结点最多有两棵子树 左子树和右子树 次序不可以颠倒 性质 1 非空二叉树的第n层上至多有2 n 1 个元素 2 深度为h的二叉树至多有2 h 1个结点 满二叉树 所有终端都在同一层次 且非终端结点的度数为2 在满二叉树中若
  • 二叉树建立

    结束二叉树输入 如何结束创建二叉树的输入那 把二叉树补全 前序 输入 AB C 中序 B A C 后序 B CA 输出结果如下 代码如下 include
  • 堆排序算法的具体分析和实现

    定义 堆就是完全二叉树的数据结构 堆排序是利用二叉树的孩子与双亲节点的比较来实现的排序方法 大顶堆 每个节点的值都大于或者等于它的左右子节点的值 小顶堆 每个节点的值都小于或者等于它的左右子节点的值 这里使用的是大顶堆 基本思想 堆排序的基
  • 两个二叉树的合并

    将给定两个二叉树 想象当你将它们中的一个覆盖到另一个上时 两个二叉树的一些节点便会重叠 你需要将他们合并为一个新的二叉树 合并的规则是如果两个节点重叠 那么将他们的值相加作为节点合并后的新值 否则不为 NULL 的节点将直接作为新二叉树的节
  • 二叉树的性质

    二叉树的性质以及满二叉树 完全二叉树 性质一 在二叉树的第i层 最多有2的 i 1 次方个结点i gt 1 性质二 深度为k的二叉树上最多有含有2的k次方 1个结点 k gt 1 性质三 对于任何一个二叉树 若它含有n0个叶子结点 n2个度
  • 线索二叉树(中序、先序和后序及遍历)

    链式存储 线索二叉树是二叉树的一类 在看线索二叉树之前我们先看一下二叉树的链式存储 一个二叉树的存储例子 后面用到的二叉树都是这棵 代码是这样的 public class BinaryTreeNode
  • C语言二叉树的基本操作(超全)

    二叉树作为数据结构其实是一个挺有意思的结构 可以有多种应用 我们直接来看一下二叉树的代码 include
  • 力扣 - 102、二叉树的层序遍历(剑指Offer - 面试题32:从上到下打印二叉树)

    题目 给你一个二叉树 请你返回其按 层序遍历 得到的节点值 即逐层地 从左到右访问所有节点 示例 二叉树 3 9 20 null null 15 7 3 9 20 15 7 输出层序遍历的结果 3 9 20 15 7 分析 迭代法 用一个队
  • 面试经典(16)--二叉树根节点到指定节点的路径

    题目描述 给定一棵二叉树和二叉树中一个节点 输出根节点到指定节点间的路径 10 5 12 4 7 指定节点7 那么输出路径应该是10 5 7 分析与解法 这个题目是在我做过蛮多二叉树的题目之后总结的一道题目 发现很多题目都可以抽象出来这个题
  • 2022蓝桥杯学习——1.递归和递推

    递归 关于递归 所有的递归都可以转换成一棵递归搜索树 我们需要考虑的是枚举的顺序 例题 1 递归实现指数型枚举 题目描述 从 1 n 这 n 个整数中随机选取任意多个 输出所有可能的选择方案 输入格式 输入一个整数 n 输出格式 每行输出一
  • 树的广度优先遍历与深度优先遍历算法

    1 树的广度优先遍历算法 广度优先遍历算法 又叫宽度优先遍历 或横向优先遍历 是从根节点开始 沿着树的宽度遍历树的节点 如果所有节点均被访问 则算法中止 如上图所示的二叉树 A 是第一个访问的 然后顺序是 B C 然后再是 D E F G
  • 二叉树的递归遍历、非递归遍历、层次遍历

    1 递归遍历 2 非递归遍历 3 层次遍历 1 递归遍历 在使用递归遍历的时候 每个节点会经过三次 public class PreInPosTraversal public static class Node public int val
  • 二叉树的实现及其遍历(Python)

    树是一种基本的 非线性 数据结构 数据结构树分为 根 枝和叶三个部分 节点Node 是组成树的基本部分 每个节点具有名称或 键值 边Edge 边是组成树的另一个基本部分 根Root 树中唯一一个没有入边的节点 路径Path 由边依次连接在一
  • JAVA实现二叉树的前、中、后序遍历(递归与非递归)

    最近在面试中遇到过问到二叉树后序遍历非递归实现的方法 之前以为会递归的解决就OK 看来还是太心存侥幸 在下一次面试之前 特地整理一下这个问题 首先二叉树的结构定义 java代码如下 public class Node private int
  • 基础算法题——画树(卡特兰数)

    卡特兰数简介 卡特兰数又称卡塔兰数 英文名Catalan number 是组合数学中一个常出现在各种计数问题中出现的数列 卡特兰数前几项为 1 1 2 5 14 42 132 429 1430 4862 16796 58786 208012

随机推荐

  • 从壹开始 [ Design Pattern ] 之二 ║ 单例模式 与 Singleton

    前言 这一篇来源我的公众号 如果你没看过 正好直接看看 如果看过了也可以再看看 我稍微修改了一些内容 今天讲解的内容如下 一 什么是单例模式 单例模式 英文名称 Singleton Pattern 这个模式很简单 一个类型只需要一个实例 他
  • python使用openai生成图像教程详解

    OpenAI 是一个人工智能的工具包 包括神经网络 遗传算法和有限状态机等 使用python可以非常便捷的操作OpenAI的API 一下是OpenAI官网列举的功能DEMO 首先使用python的pip进行openai库的安装 pip in
  • Springboot整合Nacos配置中心 多环境配置

    Nacos多环境的配置 方法一 1 在项目中的bootstrap yaml文件中配置激活指定的配置文件 spring application name gabriel cloud nacos config server addr 127 0
  • 如何申请iOS推送证书p12文件并配置极光推送平台

    编辑切换为居中 添加图片注释 不超过 140 字 可选 极光推送平台需要上传配置开发测试的iOS推送证书 开发环境 和上架到App Store的iOS推送证书 生产环境 以下是申请这两个环境的推送证书p12文件的教程 创建APP ID时勾选
  • 显卡检测工具:GPU-Z

    今天小编为大家测试了一款轻量级的GPU显卡的测试工具 可以查看GPU的详细信息 以供各位同学们学习 一 简单介绍 GPU Z是一款方便实用的软件工具 专门为用户提供视频卡和GPU的详尽信息 它具有轻巧的特点 不需要安装即可使用 并且可以一键
  • matlab中svd, svds, lansvd 函数

    首先我们看一下wiki上关于奇异值分解的理论描述 1 理论描述 假设M是一个m n阶矩阵 其中的元素全部属于域K 也就是实数域或复数域 如此则存在一个分解使得 displaystyle M U Sigma V 其中U是m m阶酉矩阵 是m
  • 小记初学android过程中遇到的小问题(android 4.4)

    在layout文件中有下面这样一个编辑框
  • List> 转 Map>

    将List转成Map结构 以下为没有水平的写法 好久之前写的土方法转换 不知道有没有优秀的解法 还希望大家提供 Map
  • 吸尘器电机拆解图解_家庭打扫全能选手-美的无线吸尘器P2G

    最近美的推出了一款轻便式家用吸尘器 一改吸尘器在心中笨大重托的形象 但具体清洁效果与实际体验如何呢 现在就让我们全方位探究一下这台美的无线吸尘器P2G 部件及功能介绍 包装小巧到我惊掉下巴 这真的就可以组装成一台吸尘器吗 打开包装 有序排列
  • JAVA多态(超详细讲解)

    目录 多态的基本介绍 实现多态的条件 1 继承 必须要有子类继承父类的继承关系 2 重写 子类需要对父类中的一些方法进行重写 然后调用方法时就会调用子类重写的方法而不是原本父类的方法 3 向上转型 在多态中需要将子类的引用赋给父类对象 只有
  • Windows下搭建nginx和rtspToWebRTC以及Windows程序添加为服务开机启动和后台运行

    1 前言 之前的rtsp转webrtc的服务很好用 https blog csdn net weixin 39510813 article details 123718363 spm 1001 2014 3001 5502 测试使用效果都很
  • Axios 企业级3封装以及常见的get和post请求写法

    简洁用法 发送get请求 第一种 适合少量参数 axios get api url 参数名1 参数值1 参数2 参数值2 then res gt res data就是后端响应的数据 catch err gt err就是错误信息 请求挂掉了
  • expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘struct’

    这篇准备长期更新 1 在编译时遇到错误 错误 expected asm or attribute before struct src cli socket handle c 在函数 client login 中 这种错误第一次遇到肯定很懵逼
  • iptables的基本使用

    iptables 防火墙 防火墙的分类 Netfilter 链的概念 表的概念 表链的关系 iptables规则的匹配 iptables 的命令 查询规则 添加规则 删除规则 修改规则 保存规则 iptables的扩展模块 Tcp模块 mu
  • 基于Java设计和实现系统的自动化巡检

    系统巡检对于系统管理员并不陌生 日常工作是离不开它的 笔者记得进入运维岗位的第一天 学习的第一课就是如何系统巡检 首先远程登陆各服务器 然后通过执行命令或操作页面查看系统内存 CPU和磁盘利用率等情况 最后将相应的数值填写入系检表格 看似几
  • 新一代视频压缩编码标准-----H.264/AVC

    2 数字视频 2 1 2 数字电视PCM原理 将输入的模拟信号转化为输出的数字电视信号 经过取样 量化 编码三个步骤 由A D变换器完成 2 1 2 1 取样 在时间轴上将连续变化的模拟信号 转化为离散量 2 1 2 2 量化 因取样后的脉
  • 服务中不存在mysql 或者没有启动成功

    服务器中不存在mysql mysql admin V 查看mysql环境的配置是否成功 成功则执行services msc 去服务中查找mysql服务 如果有则设置自动启动 或者 执行net start mysql 黑窗口开启服务 如果没有
  • 【AI面试】RoI Pooling 和 RoI Align 辨析

    RoI Pooling和RoI Align是两种常用的目标检测中的RoI特征提取方法 它们的主要区别在于 如何将不同大小的RoI对齐到固定大小的特征图上 并在这个过程中保留更多的空间信息 如果你是做目标检测相关的项目 那么这个问题肯定是跑不
  • 嵌入式单元测试框架之Ceedling

    Ceedling Ceedling 是一个用 Ruby 语言编写的自动化测试框架 一个 C 项目构建系统 是对 Ruby Rake 的一个延申 Ceedling 主要目标是以测试为驱动的 C 语言开发 集成CMock Unity CExce
  • 【算法】中序与后序遍历序列构造二叉树(二叉树、递归)

    106 从中序与后序遍历序列构造二叉树 根据一棵树的中序遍历与后序遍历构造二叉树 注意 你可以假设树中没有重复的元素 例如 给出中序遍历 inorder 9 3 15 20 7 后序遍历 postorder 9 15 7 20 3 返回如下