★【递归】【构造二叉树】Leetcode 106.从中序与后序遍历序列构造二叉树

★【递归】【构造二叉树】Leetcode 106.从中序与后序遍历序列构造二叉树 105. 从前序与中序遍历序列构造二叉树

  • 106.从中序与后序遍历序列构造二叉树
    • :star:思路分析
    • 递归解法
  • 105. 从前序与中序遍历序列构造二叉树
    • 递归解法

---------------🎈🎈题目链接🎈🎈-------------------

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

在这里插入图片描述

⭐️思路分析

后序数组: 左 右 中
中序数组: 左 中 右
以后序数组的最后一个元素(即为根节点)为切割点,先切中序数组,
再根据中序数组的左长度,反过来再切后序数组的左和右。
一层一层切下去,每次后序数组最后一个元素就是节点元素。

在这里插入图片描述

递归解法

在这里插入图片描述
⭐️⭐️⭐️⭐️⭐️⭐️
1. 如果数组大小为0,说明是空节点,return null
2. 如果不为空,那么取后序数组的最后一个节点
3. 找到后序数组最后一个节点 在中序数组中的位置 作为切割点
4. 切割中序数组,切成中序左数组 和 中序右数组
5. 根据中序左数组的长度,切割后序数组,切成后序左数组和后序右数组
6. 递归处理左区间和右区间

时间复杂度O(N)
空间复杂度O(N)
采用了【左闭右闭】——只要一直保持一致就行

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) {//1.如果数组为空 那么就返回nullif(inorder.length ==0 || postorder.length==0){return null;}return helper(inorder, postorder, 0, inorder.length-1, 0,postorder.length-1);//}public TreeNode helper(int[] inorder, int[] postorder, int inorderBegin, int inorderEnd, int postorderBegin, int postorderEnd){if(postorderBegin > postorderEnd){return null;}// 采用左闭右闭//2.如果不为空, 那么就取后序数组的最后一个元素int rootval = postorder[postorderEnd];TreeNode root= new TreeNode(rootval);//3.切割中序数组 得到对应中序数组中rootval所在的位置  进而得到中序左数组 中序右数组int midIndex;for(midIndex = inorderBegin; midIndex<=inorderEnd; midIndex++){if(inorder[midIndex] == rootval){break;}}int leftInorderBegin = inorderBegin;  // 中序左数组开头int leftInorderEnd = midIndex-1;      // 中序左数组结尾int rightInorderBegin = midIndex+1;    // 中序右数组开头int rightInorderEnd =  inorderEnd;     // 中序右数组结尾//4.根据中序左数组 切割后序数组,得到后序左数组 后序右数组int leftPostorderBegin = postorderBegin;                 // 后序左数组开头int leftPostorderEnd = postorderBegin + midIndex -inorderBegin -1;         // 后序左数组结尾int rightPostorderBegin = leftPostorderEnd+1;           // 后序右数组开头int rightPostorderEnd = postorderEnd-1;                  // 后序右数组结尾//5.递归处理左子树和右子树root.left = helper(inorder, postorder, leftInorderBegin, leftInorderEnd, leftPostorderBegin, leftPostorderEnd);root.right = helper(inorder, postorder, rightInorderBegin, rightInorderEnd, rightPostorderBegin, rightPostorderEnd);return root;}
}

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

递归解法

⭐️⭐️⭐️⭐️⭐️⭐️
接受参数int[ ] preorder, int[ ] inorder, preorder的开始,preorder的结束,inorder的开始,inorder的结束
1. 如果数组大小为0,说明是空节点,return null
2. 从前序的第一个得到根节点root
3. 根据midval 在中序数组inorder中 寻找切割点midindex
4. 对中序数组inorder进行切割 :中序左(begin/end) 中序右(begin/end)
5. 根据分化结果,对前序数组preorder进行切割 :前序左(begin/end) 前序右(begin/end)
6. 进行左右子树构建递归

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public TreeNode buildTree(int[] preorder, int[] inorder) {// 采用左闭右闭if(preorder.length == 0) return null;return helper(preorder, inorder, 0, preorder.length-1, 0, inorder.length-1);}public TreeNode helper(int[] preorder, int[] inorder, int preorderBegin, int preorderEnd, int inorderBegin, int inorderEnd){// 接受参数int[] preorder, int[] inorder, preorder的开始,preorder的结束,inorder的开始,inorder的结束// 1.如果数组大小为0,说明是空节点,return nullif(preorderBegin > preorderEnd){return null;}// 2.从前序的第一个得到根节点rootint midval = preorder[preorderBegin];TreeNode root = new TreeNode(midval);// 3. 根据midval 在中序数组inorder中 寻找切割点midindexint midindex;for(midindex = inorderBegin; midindex<=inorderEnd; midindex++){if(inorder[midindex] == midval){break;}}// 4.对中序数组inorder进行切割 :中序左(begin/end) 中序右(begin/end)int inorderLeftBegin = inorderBegin;int inorderLeftEnd = midindex-1;int inorderRightBegin =midindex+1;int inorderRightEnd = inorderEnd;// 5.根据分化结果,对前序数组preorder进行切割 :前序左(begin/end) 前序右(begin/end)int preorderLeftBegin = preorderBegin+1;int preorderLeftEnd = preorderLeftBegin + midindex-inorderBegin-1;int preorderRightBegin = preorderLeftEnd+1;int preorderRightEnd = preorderEnd;// 进行左右子树构建递归root.left = helper(preorder, inorder, preorderLeftBegin,preorderLeftEnd, inorderLeftBegin, inorderLeftEnd); //左root.right = helper(preorder, inorder, preorderRightBegin,preorderRightEnd, inorderRightBegin, inorderRightEnd); //右return root;}
}

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

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

相关文章

计算机网络-IP网络划分专题

1.8421法二转十&#xff08;连加&#xff09;或十转二&#xff08;连减&#xff09; 如下图&#xff1a; 2.IP地址 4个字节32位。每一个8位组用0~255表示。因此&#xff0c;最小的IP地址值为0.0.0.0&#xff0c;最大的地址值为255.255.255.255。 3.位数和个数的关系&#xff…

内核中断体系概括

文章目录 前言一、Linux的中断机制1、分类2、代码结构 二、中断的工作流程1、中断的工作流程2、Linux 中中断的工作流程3、中断的代码实现过程 三、内核中断体系结构 前言 本文对内核中断进行概括以及讲述中断的具体实现方法在内核是怎么做的&#xff0c;会结合内核源码中的一…

【Flink】Flink 中的时间和窗口之窗口(Window)

1. 窗口的概念 Flink是一种流式计算引擎&#xff0c;主要是来处理无界数据流&#xff0c;数据流的数据是一直都有的&#xff0c;等待流结束输入数据获取所有的流数据在做聚合计算是不可能的。为了更方便高效的处理无界流&#xff0c;一种方式就是把无限的流数据切割成有限的数…

c语言-day1(ubuntu操作系统及指令)

1&#xff1a;思维导图 2&#xff1a; &#xff08;1&#xff09;&#xff1a; &#xff08;2&#xff09; &#xff08;3&#xff09; &#xff08;4&#xff09; &#xff08;5&#xff09;

通过盲注脚本复习sqllabs第46关 order by 注入

sql-lab-46 order by 注入是指其后面的参数是可控的&#xff0c; order by 不同于我们在 where 后的注入点&#xff0c;不能使用 union 等注入&#xff0c;其后可以跟接 报错注入 或者 时间盲注。 数字型order by注入时,语句order by2 and 12,和order by2 and 11显示的结果一…

C语言KR圣经笔记 8.5样例 - fopen和getc的实现

8.5 样例 - fopen 和 getc 的实现 通过给出标准库例程 fopen 和 getc 的一个实现&#xff0c;我们来说明如何将前面这些内容组合起来。 回忆一下&#xff0c;在标准库中&#xff0c;文件用文件指针而不是文件描述符来描述。文件指针是包含一些文件信息的结构体指针&#xff1…

金融贷款风险预测:使用图神经网络模型进行违约概率评估

要使用PyTorch和GNN&#xff08;图神经网络&#xff09;来预测金融贷款风险&#xff0c;并加入注意力机制&#xff0c;我们首先需要构建一个贷款风险预测的图数据集。然后&#xff0c;我们将设计一个基于注意力机制的GNN模型。 以下是一个简化的代码示例&#xff0c;演示了如何…

前端框架的CSS模块化(CSS Modules)

创作纪念日之际&#xff0c;来给大家分享一篇文章吧 聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们…

Vue前端对请假模块——请假开始时间和请假结束时间的校验处理

开发背景&#xff1a;Vueelement组件开发 业务需求&#xff1a;用户提交请假申请单&#xff0c;请假申请的业务逻辑处理 实现&#xff1a;用户选择开始时间需要大于本地时间&#xff0c;不得大于请假结束时间&#xff0c;请假时长根据每日工作时间实现累加计算 页面布局 在前…

Linux socket函数

什么是协议 在网络编程中&#xff0c;协议是指计算机系统之间进行通信和交互所遵循的规则和约定。它定义了数据的格式、传输方式、错误处理、认证和授权等方面的规范&#xff0c;以确保不同计算机之间能够正确地交换信息。 协议分为多个层次&#xff0c;每个层次负责不同的功…

二进制部署k8s之网络部分

1 CNI 网络组件 1.1 K8S的三种接口 CRI 容器运行时接口 docker containerd podman cri-o CNI 容器网络接口 flannel calico cilium CSI 容器存储接口 nfs ceph gfs oss s3 minio 1.2 K8S的三种网络 节点网络 nodeIP 物理网卡的IP实现节点间的通信 Pod网络 podIP Pod与Po…

视频和音频使用ffmpeg进行合并和分离(MP4)

1.下载ffmpeg 官网地址&#xff1a;https://ffmpeg.org/download.html 2.配置环境变量 此电脑右键点击 属性 - 高级系统配置 -高级 -环境变量 - 系统变量 path 新增 文件的bin路径 3.验证配置成功 ffmpeg -version 返回版本信息说明配置成功4.执行合并 ffmpeg -i 武家坡20…

GOOGLE Colab Pro会员订阅开通购买付费充值教程

一、简介 colab由谷歌团队开发&#xff0c;用于机器学习、数据分析&#xff0c;教育等目的&#xff0c;他的会员也非常的昂贵&#xff0c;最基本的套餐要10美金&#xff0c;最高要50美金一个月&#xff0c;如何省钱&#xff0c;往下看。 一般来说土区的价格比较便宜&#xff0…

Day02:Web架构前后端分离站Docker容器站集成软件站建站分配

目录 常规化站点部署 站库分离 前后端分离 集成软件搭建Web应用 Docker容器搭建Web应用 建立分配站 静态 与 伪静态 总结 章节知识点&#xff1a; 应用架构&#xff1a;Web/APP/云应用/三方服务/负载均衡等 安全产品&#xff1a;CDN/WAF/IDS/IPS/蜜罐/防火墙/杀毒等 渗…

基于单片机的企业指纹考勤系统设计

摘要: 考勤系统是企业人力资源管理的重要依据,传统的考勤系统不能保证准确性,也存在地域局限,不能满足一些跨区域集团公司的考勤要求。文章以单片机技术以及生物特征识别技术为基础,分析企业单片机智能化指纹考勤系统的设计思路,从硬件设备的选型和配置、软件系统的开发、…

ES6 对象面试题

ES6 对象面试题 问题描述&#xff1a; 什么是对象的简洁表示法&#xff08;Shorthand Property&#xff09;&#xff1f;给出一个使用简洁表示法的示例。 答案&#xff1a; 对象的简洁表示法是一种在对象字面量中定义属性的简化语法。当属性名和变量名相同时&#xff0c;可以省…

怎么把pdf转换成word?

怎么把pdf转换成word&#xff1f;Pdf和word在电脑上的使用非常广泛&#xff0c;pdf和word分别是由 Adobe和Microsoft 分别开发的电脑文件格式。PDF 文件可以在不同操作系统和设备上保持一致的显示效果&#xff0c;无论是在 Windows、Mac 还是移动设备上查看&#xff0c;都能保持…

【学习笔记】SCI投稿状态

大多数SCI期刊都有自己的在线投稿系统&#xff0c;如ScholarOne Manuscripts、Editorial Manager等&#xff0c;这些系统使得投稿、审稿、编辑和出版过程变得更加高效和透明。投稿系统通常要求作者注册账户&#xff0c;然后根据指导逐步提交稿件及相关信息。 投稿状态介绍 Sub…

Encoder和Decoder的详细介绍

——参考傅里叶变换&#xff08;Encoder&#xff09;、处理和傅里叶逆变换&#xff08;Decoder&#xff09; 1.Encoder&#xff08;编码器&#xff09; 编码器&#xff08;Encoder&#xff09;通常指的是在机器学习和神经网络领域中的一种组件或模型结构&#xff0c;用于将输入…

配置多个后端 API 代理

在开发 React 应用时&#xff0c;通常会涉及到与后端 API 的交互。而在开发过程中&#xff0c;我们经常需要在开发环境中使用代理来解决跨域请求的问题。Create React App 提供了一种简单的方式来配置代理&#xff0c;即通过创建一个名为 setupProxy.js 的文件来配置代理规则。…