代码随想录Day15 二叉树 LeetCodeT513 找树左下角的值 T112路径总和 T106 从中序和后序遍历构造二叉树

以上思路来自于:代码随想录 (programmercarl.com)

LeetCode T513 找树左下角的值

题目思路:

本题思路:这题我们使用递归法和迭代法解决问题

注意:左下角的值不一定就是一直向左遍历的叶子结点的值,首先可以确定是最后一行的第一个叶子结点的值,也就是最大深度的叶子结点的值

定义最大深度Deep变量,返回值result

1.递归法

前序遍历为例

1.1 确定递归的返回值和参数类型

我们这里不需要返回值,传入参数是节点和深度

void travelsal(TreeNode node,int deep)

1.2 确定终止条件

这里我们遇到一次叶子结点就更新一次最大深度,并记录下该节点的val

     if(node.left == null && node.right == null){if(deep>Deep){Deep = deep;result = node.val;}}

1.3 实现一次递归

    if(node.left != null){travelsal(node.left,deep+1);}if(node.right != null){travelsal(node.right,deep+1);}

2.迭代法

思路:使用层序遍历,找到最后一行,记录下最左边节点的数值

1.使用队列结构,队列不为空就继续,先加入根节点,接着我们用一个临时节点记录一下正在遍历的节点,方便取值,使用for循环,遍历每一层,记录下每一层第一个值,如果不是叶子节点就继续入队,详细思路可以看 层序遍历章节

代码解析:

public int findBottomLeftValue(TreeNode root) {//迭代法int result = 0;Queue<TreeNode> que = new LinkedList<>();que.offer(root);while(!que.isEmpty()){int size = que.size();for(int i = 0;i<size;i++){TreeNode tmp = que.poll();if(i == 0){result = tmp.val;}if(tmp.left != null){que.offer(tmp.left);}if(tmp.right != null){que.offer(tmp.right);}}}return result;}
}

题目代码:

class Solution {int Deep = -1;int result = 0;public int findBottomLeftValue(TreeNode root) {result = root.val;travelsal(root,0);return result;}void travelsal(TreeNode node,int deep){if(node == null){return;} if(node.left == null && node.right == null){if(deep>Deep){Deep = deep;result = node.val;}}if(node.left != null){travelsal(node.left,deep+1);}if(node.right != null){travelsal(node.right,deep+1);}}
}

LeetCode T112 路径总和

题目链接:112. 路径总和 - 力扣(LeetCode)

题目思路:

思路其实很简单,我们只需要遍历二叉树在叶子节点的时候判断即可,但是还是有很多细节需要注意,我们分一下几步操作,判断节点是否为空,减去该节点的值,判断叶子结点的值,下面就是递归的过程

1.判断头结点

    if(root == null){return false;}

2.叶子节点

        //叶子结点if(root.left == null && root.right == null){return targetSum == 0;}

3.递归过程

         //递归逻辑if(root.left != null){boolean left = hasPathSum(root.left,targetSum);if(left){return true;}}if(root.right != null){boolean right = hasPathSum(root.right,targetSum);if(right){return true;}}

注:我们这里用目标值一直往下减,如果到叶子节点发现值减到0就说明成功了,注意回溯的过程这里省略了.

题目代码:

class Solution {  public boolean hasPathSum(TreeNode root, int targetSum) {  //终止条件if(root == null){return false;}targetSum -= root.val;//叶子结点if(root.left == null && root.right == null){return targetSum == 0;}//递归逻辑if(root.left != null){boolean left = hasPathSum(root.left,targetSum);if(left){return true;}}if(root.right != null){boolean right = hasPathSum(root.right,targetSum);if(right){return true;}}return false;}  
}

T106 从中序和后序遍历构造二叉树

题目链接:106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)

 

题目思路:

这题思路较为简单,代码较长,我们举一个例子

我们首先根据后序的左右中来切割中序数组,就能知道9是左子树,15 20 7是右子树

然后根据右子树判断中节点是20,20的左节点是15右节点是7,我们就能唯一确定一个二叉树

这里我们分为以下几步处理

1.创建一个map来便于查找

2.将inorder的数据保存到map中 (key是数值,value是下标)

3.接着我们使用递归来实现

4.确定参数和返回值

public TreeNode findNode(int[] inorder, int inBegin, int inEnd, int[] postorder, int postBegin, int postEnd) 

5.终止条件(注意这里切分区间要统一,使用闭区间还是左开右闭区间)

 if (inBegin >= inEnd || postBegin >= postEnd) {  // 不满足左闭右开,说明没有元素,返回空树return null;}

6.单次递归

        int rootIndex = map.get(postorder[postEnd - 1]);  // 找到后序遍历的最后一个元素在中序遍历中的位置TreeNode root = new TreeNode(inorder[rootIndex]);  // 构造结点int lenOfLeft = rootIndex - inBegin;  // 保存中序左子树个数,用来确定后序数列的个数root.left = findNode(inorder, inBegin, rootIndex,postorder, postBegin, postBegin + lenOfLeft);root.right = findNode(inorder, rootIndex + 1, inEnd,postorder, postBegin + lenOfLeft, postEnd - 1);

题目代码:

class Solution {Map<Integer,Integer> map;public TreeNode buildTree(int[] inorder, int[] postorder) {map = new HashMap<>();for(int i = 0;i<inorder.length;i++){map.put(inorder[i],i);}return FindOrder(inorder,0,inorder.length,postorder,0,postorder.length);}public TreeNode FindOrder(int[] inOrder,int inBegin,int inEnd,int[] postOrder,int postBegin,int postEnd){//结束条件,这里我使用左闭右开写if(inBegin>=inEnd || postBegin>=postEnd){return null;}//找到后序在中序的位置int index = map.get(postOrder[postEnd - 1]);//构造节点TreeNode root = new TreeNode(inOrder[index]);//保存中序左子树的个数,用来确定后序的区间int lenOfLeft = index - inBegin;root.left = FindOrder(inOrder,inBegin,index,postOrder,postBegin,postBegin+lenOfLeft);root.right = FindOrder(inOrder,index+1,inEnd,postOrder,postBegin+lenOfLeft,postEnd-1);return root;}
}

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

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

相关文章

【JavaEE】多线程(五)- 基础知识完结篇

多线程&#xff08;五&#xff09; 文章目录 多线程&#xff08;五&#xff09;volatile关键字保证内存可见性JMM&#xff08;Java Memory Model&#xff09; 不保证原子性 wait 和 notifywait()notify()线程饿死 上文我们主要讲了 synchronized以及线程安全的一些话题 可重入…

Unity设计模式——装饰模式

装饰模式&#xff08;Decorator&#xff09;&#xff0c;动态地给一个对象添加一些额外的职责&#xff0c;就增加功能来说&#xff0c;装饰模式比生成子类更为灵活。 Component类&#xff1a; abstract class Component : MonoBehaviour {public abstract void Operation(); …

网络层协议—IP协议

网络层协议—IP协议 文章目录 网络层协议—IP协议网络层简介IP协议简介IP协议文格式IP协议报头实现网络互联的使用设备 网段划分IP地址划分子网掩码IP地址的特点特殊的IP地址IP地址的数量限制私有IP地址和公网IP地址NAT技术 路由报文的分片与组装IP地址和硬件地址 网络层简介 …

Spring 统一处理(JavaEE进阶系列6)

目录 前言&#xff1a; 1.用户登录权限的校验 2.Spring拦截器 2.1自定义拦截器 2.2将自定义拦截器加入到系统配置 2.3拦截器练习 2.4拦截器的实现原理 3.统一异常处理 4.统一数据的返回格式 结束语&#xff1a; 前言&#xff1a; 接下来就是Spring Boot中的统一功能…

对于使用win32 API获取性能计数器的理解

微软提供了获取性能计数器的接口&#xff0c;如下 LSTATUS RegQueryValueExA([in] HKEY hKey,[in, optional] LPCSTR lpValueName,LPDWORD lpReserved,[out, optional] LPDWORD lpType,[out, optional] LPBYTE lpData,[in, out, optional] L…

mysql面试题30:什么是数据库连接池、应用程序和数据库建立连接的过程、为什么需要数据库连接池、你知道哪些数据库连接池

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:什么是数据库连接池? 数据库连接池是一种用于管理和复用数据库连接的技术。它是在应用程序和数据库之间建立一组数据库连接,并以池的形式存储起…

Kubernetes革命:云原生时代的应用编排和自动化

文章目录 什么是Kubernetes以及为何它备受欢迎&#xff1f;云原生应用和K8s的关系Kubernetes的核心概念&#xff1a;Pods、Services、ReplicaSets等部署、扩展和管理应用程序的自动化容器编排的演进&#xff1a;Docker到Kubernetes实际用例&#xff1a;企业如何受益于K8s的应用…

winform窗体控件太多显示不过来,怎么实现滚动条

winform窗体控件太多显示不过来&#xff0c;怎么实现滚动条 Winform Panel实现滚动条 一、创建panel 在界面上拖拽一个父级Panel1&#xff0c;然后在Panel1里面拖拽一个子级Panel2 设置父级Panel1的AutoScroll属性为True 属性设置好后&#xff0c;当子级高度或者宽度大于父…

LED灯实验--汇编

asm-led.S .text .global _start _start: /* 1. led灯的初始化 *//* 1.1 使能GPIOE、DPIOF外设控制器的时钟 */ldr r0, 0x50000A28ldr r1, [r0]orr r1, r1, #(0x3 << 4)str r1, [r0]/* 1.2 设置PE10、PE8、PF10引脚为输出模式 */ldr r0, 0x50006000ldr r1, [r0]bic r1,…

jenkins工具系列 —— 插件 使用Changelog获取commit记录

文章目录 安装changelog插件重启jenkins配置 ChangelogExecute shell 使用 changelog邮件中html格式也可以使用构建测试&#xff08;查看构建项 -> 控制台输出&#xff09; 安装changelog插件 插件文件可通过 V 获取 点击 左侧的 Manage Jenkins —> Plugins ——> …

虹科方案 | 汽车CAN/LIN总线数据采集解决方案

全文导读&#xff1a;现代汽车配备了复杂的电子系统&#xff0c;CAN和LIN总线已成为这些系统之间实现通信的标准协议&#xff0c;为了开发和优化汽车的电子功能&#xff0c;汽车制造商和工程师需要可靠的数据采集解决方案。基于PCAN和PLIN设备&#xff0c;虹科提供了一种高效、…

基于SSM的个人博客系统

实现内容 本系统为用户提供实现了以下功能&#xff1a; 1.登录功能&#xff1a; 系统为单用户系统&#xff0c;为用户分配了用户名和密码。用户必须先登录&#xff0c;进入操作界面。用户输入ID和密码&#xff0c;通过服务器验证方可运行&#xff0c;否则显示消息提示。 2.…

鸿蒙手表开发之使用adb命令安装线上包

#国庆发生的那些事儿# 鸿蒙手表开发之使用adb命令安装线上包 前言&#xff1a; 由于之前的哥们匆忙离职了&#xff0c;所以鸿蒙手表项目的新版本我临时接过来打包发布&#xff0c;基本上之前没有啥鸿蒙经验&#xff0c;但是一直是做Android开发的&#xff0c;在工作人员的指…

6款流程图制作软件:一站式指南

流程图是一种常用的图示工具&#xff0c;可以帮助我们更清晰地表达和展示流程、流程图等内容。在今天已经变得非常普及和便捷&#xff0c;接下来本文将于大家分享6款好用的流程图软件&#xff0c;一起来看看吧&#xff01; 博思白板boardmix 博思白板boardmix是一款基于浏览器…

使用gpio子系统实现按键驱动(二)

一&#xff0c;gpio_keys.c介绍 Linux内核下的drivers/input/keyboard/gpio_keys.c实现了一个体系无关的GPIO按键驱动&#xff0c;使用此按键驱动&#xff0c;只需要在设备树gpio-key节点添加需要的按键子节点即可&#xff0c;适合于实现独立式按键驱动。 gpio-keys是基于inp…

关于ABB速度,加速度,轴监控指令

关于ABB速度&#xff0c;加速度&#xff0c;轴监控 关于轴监控指令要选择启用和关闭&#xff0c;这个指令是为了防止机器人在抓件放件过程中6轴来回旋转&#xff0c;已最佳的姿态运动 收录于合集 #ABB机器人 9个 上一篇关于ABB机器人的IO创建和设置

嵌入式养成计划-38----C++--匿名对象--友元--常成员函数和常对象--运算符重载

八十七、匿名对象 概念&#xff1a;没有名字对象格式 &#xff1a;类名&#xff08;&#xff09;;作用 用匿名对象给有名对象初始化的用匿名对象给对象数组初始化的匿名对象作为函数实参使用 示例 : #include <iostream> using namespace std; class Dog { private:s…

微电网单台并网逆变器PQ控制matlab仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 微电网运行在并网模式下且公共电网供应正常时&#xff0c;因为公共电网给定了电 压和频率的参考值&#xff0c;所有的逆变器可以使用PQ控制方式。 当系统频率为额定频率f0时&#xff0c;系统稳定在A点&#x…

awvs 中低危漏洞

低危 X-Frame-Options Header未配置 查看请求头中是否存在X-Frame-Options Header字段 会话Cookie中缺少secure属性(未设置安全标志的Cookie) 当cookie设置为Secure标志时&#xff0c;它指示浏览器只能通过安全SSL/TLS通道访问cookie。 未设置HttpOnly标志的Cookie 当cookie设置…

终于找到了!多种类型的电子期刊模板在这里!

经过我不懈的努力和搜寻&#xff0c;终于找到了一个提供多种类型电子期刊模板的网站。这个网站拥有丰富多样的模板&#xff0c;可以满足各种不同的需求&#xff0c;无论是学术研究、商业报告还是个人兴趣爱好&#xff0c;都能在这里找到心仪的模板。 一、网站介绍 这个网站叫做…