代码随想录算法训练营第十八天|513. 找树左下角的值|112. 路径总和|106. 从中序与后序遍历序列构造二叉树

513. 找树左下角的值

题目:给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。
假设二叉树中至少有一个节点。

示例 1:请添加图片描述

输入: root = [2,1,3]
输出: 1

思路一:层序遍历,最后一层的第一个元素,即是树左下角的值。
思路二:通过递归,深度优先遍历原则,因为本题没有 中间节点的处理逻辑,所以使用前、中、后序遍历都可以,保证优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值


思路一:层序遍历
C#代码

/*** Definition for a binary tree node.* public class TreeNode {*     public int val;*     public TreeNode left;*     public TreeNode right;*     public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
public class Solution {public int FindBottomLeftValue(TreeNode root) {var result = 0;if(root == null) return result;var queue = new Queue<TreeNode>();queue.Enqueue(root);while(queue.Any()){int len = queue.Count;var itemList = new Queue<int>();while(len>0){var temp = queue.Dequeue();itemList.Enqueue(temp.val);if(temp.left!=null) queue.Enqueue(temp.left);if(temp.right!=null) queue.Enqueue(temp.right);len--;}result = itemList.Dequeue();}return result;}
}

思路二:递归
C#代码

/*** Definition for a binary tree node.* public class TreeNode {*     public int val;*     public TreeNode left;*     public TreeNode right;*     public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
public class Solution {//结果值int result = 0;//最大深度int maxDepth = -1;public int FindBottomLeftValue(TreeNode root) {Traversal(root,1);return result;}// 1. 确定返回值和参数public void Traversal(TreeNode node,int depth){//2. 确定终止条件if(node.left==null&&node.right== null){//叶子节点if(depth>maxDepth){//当前深度大于最大深度maxDepth = depth;//记录当前深度为最大深度result = node.val;}}//找左下角的值所以优先遍历左左子树if(node.left!=null){depth++;Traversal(node.left,depth);//回溯深度的值depth--;//精简代码 traversal(root->left, depth + 1);  隐藏着回溯}//遍历右子树if(node.right!=null){depth++;Traversal(node.right,depth);depth--;}}
}

112. 路径总和

题目:给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

叶子节点 是指没有子节点的节点。
示例一:请添加图片描述

输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。

思路:可以使用深度优先遍历的方式(本题前中后序都可以,无所谓,因为中节点也没有处理逻辑)来遍历二叉树

C#代码:

/*** Definition for a binary tree node.* public class TreeNode {*     public int val;*     public TreeNode left;*     public TreeNode right;*     public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
public class Solution {public bool 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){if(HasPathSum(root.left,targetSum)) return true;}if(root.right!=null){if(HasPathSum(root.right,targetSum)) return true;}return false;}
}

113. 路径总和 II

题目:给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

叶子节点 是指没有子节点的节点。
示例一:请添加图片描述

输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]

C#代码:

public class Solution {List<IList<int>> result = new List<IList<int>>();public IList<IList<int>> PathSum(TreeNode root, int targetSum) {var list = new List<int>();Traversal(root,targetSum,list);return result;}public void Traversal(TreeNode root, int targetSum,List<int> list){if(root == null) return;list.Add(root.val);targetSum -= root.val;//到达叶子节点并且路径正确if(root.left==null&&root.right==null&&targetSum==0){result.Add(new List<int>(list.ToArray()));return;}if(root.left!=null){Traversal(root.left,targetSum,list);//回溯list.RemoveAt(list.Count - 1);}if(root.right!=null){Traversal(root.right,targetSum,list);//回溯list.RemoveAt(list.Count - 1);}}
}

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

题目:给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
示例一:请添加图片描述

输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
输出:[3,9,20,null,null,15,7]

思路:

  • 通过后序序列可以知道最后一个元素为根结点。
  • 知道根结点后,通过中序序列可以判断出根结点的左右子树。

解题过程:

  • 第一步:如果数组大小为零的话,说明是空节点了。
  • 第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。
  • 第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点
  • 第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)
  • 第五步:切割后序数组,切成后序左数组和后序右数组
  • 第六步:递归处理左区间和右区间

C#代码,递归

public class Solution {public TreeNode BuildTree(int[] inorder, int[] postorder) {// 1. 如果后序数组元素为0,则为空树if(postorder.Length==0) return null;// 2. 取后序序列的最后一个元素,得到根结点int rootVale = postorder[postorder.Length - 1];TreeNode node = new TreeNode(rootVale);if(postorder.Length == 1) return node;// 3. 通过根结点找到中序序列的分割点下标int index;for(index = 0; index<inorder.Length; index++){if(inorder[index] == rootVale){break;}}// 4. 分割左子树//左子树的中序序列int[] leftInorder = new int[index];//遍历拷贝// for(int i = 0;i<leftInorder.Length;i++){//     leftInorder[i] = inorder[i];// }//使用Array.Copy方法Array.Copy(inorder,0,leftInorder,0,leftInorder.Length);int[] leftPostorder = new int[leftInorder.Length];// for(int i= 0; i<leftPostorder.Length;i++){//     leftPostorder[i] = postorder[i];// }Array.Copy(postorder,0,leftPostorder,0,leftPostorder.Length);// 5. 分割右子树//右子树的中序序列int[] rightInorder = new int[inorder.Length -(index+1)];// for(int i = 0;i<rightInorder.Length;i++){//     rightInorder[i] = inorder[i+index+1];// }Array.Copy(inorder,index+1,rightInorder,0,rightInorder.Length);int[] rightPostorder = new int[rightInorder.Length];// for(int i = 0;i<rightPostorder.Length;i++){//     rightPostorder[i] = postorder[i+leftPostorder.Length];// }Array.Copy(postorder,leftPostorder.Length,rightPostorder,0,rightPostorder.Length);// 6. 递归左区间和右区间node.left = BuildTree(leftInorder,leftPostorder);node.right = BuildTree(rightInorder,rightPostorder);return node;}
}

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

题目:给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
示例一:请添加图片描述

输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]

思路和后序遍历一样,通过前序遍历的第一个元素可知根结点,通过根结点和中序序列,分割出左右子树,通过递归即可构建出二叉树。

C#代码:

public class Solution {public TreeNode BuildTree(int[] preorder, int[] inorder) {//1. 判断前序遍历长度if(preorder.Length == 0) return null;//2. 获取根结点int rootVale = preorder[0];TreeNode root = new TreeNode(rootVale);if(preorder.Length == 1) return root;//3. 获取根结点在中序序列中的下标int index;for(index = 0;index<inorder.Length;index++){if(inorder[index] == rootVale){break;}}//4. 分割左子树int[] leftInorder = new int[index];Array.Copy(inorder,0,leftInorder,0,index);int[] leftPreorder = new int[leftInorder.Length];Array.Copy(preorder,1,leftPreorder,0,leftPreorder.Length);//5. 分割右子树int[] rightInorder = new int[inorder.Length -(index+1)];Array.Copy(inorder,index+1,rightInorder,0,rightInorder.Length);int[] rigthPreorder = new int[rightInorder.Length];Array.Copy(preorder,1+leftPreorder.Length,rigthPreorder,0,rigthPreorder.Length);//6. 递归左区间和右区间root.left = BuildTree(leftPreorder,leftInorder);root.right = BuildTree(rigthPreorder,rightInorder);return root;}
}

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

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

相关文章

java实时监控mysql数据库变化

对于二次开发来说&#xff0c;很大一部分就找找文件和找数据库的变化情况 对于数据库变化。还没有发现比较好用的监控数据库变化监控软件。 今天&#xff0c;我就给大家介绍一个如何使用mysql自带的功能监控数据库变化 1、打开数据库配置文件my.ini &#xff08;一般在数据库…

c语言 2.0

1.数据类型 数据类型介绍 数据类型&#xff1a;c语言中数据类型有3种&#xff0c;分别是基本数据类型、构造数据类型、指针数据类型。 数据类型的作用&#xff1a;编译器预算数据分配的内存空间大小。 ps&#xff1a;可以通俗理解为&#xff1a;数据类型是用来规范内存的开销…

python DVWA文件上传POC练习

先直接测试POC 抓包 GET /dv/vulnerabilities/sqli/?id1%27unionselect1%2Cmd5%28123%29%23&SubmitSubmit HTTP/1.1Host: 10.9.75.161Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrom…

Tomcat服务的部署及配置优化

文章目录 1. Tomcat的相关介绍1.1 Tomcat简介1.2 Tomcat的核心组件1.2.1 Web容器1.2.2 Servlet容器1.2.3 JSP容器 1.3 Tomcat的功能组件1.3.1 connector连接器1.3.2 container容器1.3.2.1 子容器及其相关功能 1.4 主要作用1.5 Tmocat处理请求的过程 2. Tomcata服务部署2.1 安装…

log4qt库的使用

log4qt库的使用 一,什么是log4qt?二,log4qt的下载三,如何集成log4qt?1.在vs2022中集成log4qt的方法:模块一:配置log4qt的步骤步骤一,将下好的log4qt库进行解压,然后再库文件中,新建build和Log4Qt文件夹步骤二,打开cmake,有两个填写路径的位置.步骤三,点击cmake的configure按钮…

tcp满开始和拥塞避免

tcp的拥塞控制有四种算法&#xff0c;后面的快重传和快恢复是后面新增的&#xff0c; 刚开始会初始化慢开始门限值&#xff0c;并将拥塞窗口值为1往网络中发送&#xff0c;若收到确认包则将拥塞窗口翻倍&#xff0c;执行慢开始算法&#xff0c;当拥塞窗口值达到慢开始门限后&am…

02-Tomcat打破双亲委派机制

上一篇&#xff1a;01-从JDK源码级别剖析JVM类加载机制 Tomcat 如果使用默认的双亲委派类加载机制行不行&#xff1f; 我们思考一下&#xff1a;Tomcat是个web容器&#xff0c; 那么它要解决什么问题&#xff1a; 一个web容器可能需要部署两个应用程序&#xff0c;不同的应用…

Alibaba(获得店铺的所有商品) API 接口

为了进行电商平台 的API开发&#xff0c;首先我们需要做下面几件事情。 1&#xff09;开发者注册一个账号 2&#xff09;然后为每个alibaba应用注册一个应用程序键&#xff08;App Key) 。 3&#xff09;下载alibaba API的SDK并掌握基本的API基础知识和调用 4&#xff09;利…

深入浅出Android同步屏障机制

原文链接 Android Sync Barrier机制 诡异的假死问题 前段时间&#xff0c;项目上遇到了一个假死问题&#xff0c;随机出现&#xff0c;无固定复现规律&#xff0c;大量频繁随机操作后&#xff0c;便会出现假死&#xff0c;整个应用无法操作&#xff0c;不会响应事件&#xff…

【Linux】Systemd 中的单元(Unit)和单元文件(Unit File)怎么理解?

单元&#xff08;Unit&#xff09;单元文件&#xff08;Unit File&#xff09;感谢 &#x1f496; 关于systemd是什么&#xff0c;http://t.csdn.cn/pMkG7这篇文章里有详细说明。 这篇文件我们一起来看看Systemd 中的单元&#xff08;Unit&#xff09;和单元文件&#xff08;Un…

vue使用jsencrypt实现rsa前端加密

实现 RSA 加密 介绍 vue 完成 rsa 加密传输&#xff0c;jsencrypt 实现参数的前端加密 1 安装 jsencrypt npm install jsencrypt2 编写 jsencrypt.js 在 utils 文件夹中新建 jsencrypt.js 文件&#xff0c;内容如下&#xff1a;注意点&#xff1a;一般公钥都是后端生成好的&a…

excl在建模语言中的运用

目录 1.表格的定位 2.数学函数 3.自动填充功能 4.数据透视表的应用 5.切片器 6. Date(),time(),now()&#xff0c;today() 7.文本转日期 8.分裂 9.sumif函数 10.数字转换为文本的方法 11.SUMIFS()函数&#xff1a;多个条件筛选 12.宏 13.提取多个表中&#xff0c;…

大秒杀系统设计

参考链接&#xff1a;http://www.taodudu.cc/news/show-5770725.html?actiononClick 1. 一些数据 大家还记得2013年的小米秒杀吗&#xff1f;三款小米手机各11万台开卖&#xff0c;走的都是大秒系统&#xff0c;3分钟后成为双十一第一家也是最快破亿的旗舰店。 经过日志统计…

appium+jenkins实例构建

自动化测试平台 Jenkins简介 是一个开源软件项目&#xff0c;是基于java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件的持续集成变成可能。 前面我们已经开完测试脚本&#xff0c;也使用bat 批处…

文件上传之图片码混淆绕过(upload的16,17关)

目录 1.upload16关 1.上传gif loadup17关&#xff08;文件内容检查&#xff0c;图片二次渲染&#xff09; 1.上传gif&#xff08;同上面步骤相同&#xff09; 2.条件竞争 1.upload16关 1.上传gif imagecreatefromxxxx函数把图片内容打散&#xff0c;&#xff0c;但是不会…

MySQL用户管理

文章目录 MySQL用户管理1. 用户1.1 用户信息1.2 创建用户1.3 删除用户1.4 修改用户密码 2. 数据库的权限2.1 给用户授权2.2 回收权限2.2 回收权限 MySQL用户管理 如果我们只能使用root用户&#xff0c;这样存在安全隐患。这时&#xff0c;就需要使用MySQL的用户管理。 1. 用户…

flink的几种常见的执行模式

背景 在运行flink时&#xff0c;我们经常会有几种不同的执行模式&#xff0c;比如在IDE中启动时&#xff0c;通过提交到YARN上&#xff0c;还有通过Kebernates启动时&#xff0c;本文就来记录一下这几种模式 flink的几种执行模式 flink嵌入式模式&#xff1a; 这是一种我们在…

自考本科,毕业八年,2023浙大MPA提面优秀分享

去年十月中旬&#xff0c;我参加了浙江大学MPA提前批面试。结果出乎意料地&#xff0c;我竟然获得了A资格。对此&#xff0c;我自己也感到难以置信。事实上&#xff0c;我只是抱着试一试的心态递交了申请材料。因为通过我对前几年浙大自划线的情况来看&#xff0c;对于浙江大学…

用postman 推送消息到GCP的pubsub

创建1个Topic 和 2个 subscription 我们可以用terraform 去创建1个topic 和 2个subscriptions # topic resource "google_pubsub_topic" "topic_a" {name "TopicA"project var.project_id }# subscriptions resource "google_pubsub_s…

SpringMVC的常用注解,参数传递以及页面跳转的使用

目录 slf4j 常用注解 RequestMapping RequestParam RequestBody PathVariable 参数传递 首先在pom.xml配置文件中导入SLF4J的依赖 基础类型String 复杂类型 RequestParam PathVariable RequestBody 增删改查 返回值 void返回值 String返回值 modelString …