代码随想录算法训练营第十八天|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.mzph.cn/news/74849.shtml

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

相关文章

基于51单片机DS18B20温度及电流检测-proteus仿真-源程序

一、系统方案 本设计采用52单片机作为主控器&#xff0c;液晶1602显示&#xff0c;DS18B20检测温度&#xff0c;电流检测。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 void lcd_init() //lcd 初始化设置子函数&#xff0c;不带参数 ,0x…

持安科技入选数说安全《2023中国网络安全市场年度报告》

近日&#xff0c;网络安全产业研究平台数说安全发布《2023中国网络安全市场年度报告》&#xff0c;报告共分为158页核心报告&#xff0c;及番外篇《网安融资新星及融资过亿企业介绍》&#xff0c;作为以甲方身份创业的零信任办公安全明星企业&#xff0c;持安科技以网安融资新星…

MATLAB R2023a完美激活版(附激活补丁)

MATLAB R2023a是一款面向科学和工程领域的高级数学计算和数据分析软件&#xff0c;它为Mac用户提供了强大的工具和功能&#xff0c;用于解决各种复杂的数学和科学问题。以下是MATLAB R2023a Mac的一些主要特点和功能&#xff1a; 软件下载&#xff1a;MATLAB R2023a完美激活版 …

select多选回显问题 (取巧~)

要实现的效果&#xff1a; 实际上select选择框&#xff0c;我想要的是数组对象&#xff0c;但是后端返回来的是个字符串。 以下是解决方法&#xff1a; 以上是一种简单的解决方法~ 也可以自己处理数据或者让后端直接改成想要的格式。

Kafka3.0.0版本——消费者(手动提交offset)

目录 一、消费者&#xff08;手动提交 offset&#xff09;的概述1.1、手动提交offset的两种方式1.2、手动提交offset两种方式的区别1.3、手动提交offset的图解 二、消费者&#xff08;手动提交 offset&#xff09;的代码示例2.1、手动提交 offset&#xff08;采用同步提交的方式…

Python爬虫 教程:IP池的使用

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 一、简介 爬虫中为什么需要使用代理 一些网站会有相应的反爬虫措施&#xff0c;例如很多网站会检测某一段时间某个IP的访问次数&#xff0c;如果访问频率…

[SICTF 2023 #Round2] Crypto,PWN,Reverse

似乎很久没写了。 周五到周日&#xff0c;两天的这个比赛&#xff0c;有些东西还真是头回用&#xff0c;值得纪录一下。 Crypto 密码这块这届还是比较简单的&#xff0c;没有复杂的题&#xff0c;但量大分多。 【签到】古典大杂烩 给了一堆emoji的图 &#x1f429;&#x…

GCP Architect之VPN+Network

VPN 搜索结果共计:11 [单选]As part of implementing their disaster recovery plan, your company is trying to replicate their production MySQL database from their private data center to their GCP project using a Google Cloud VPN connection. They are experien…

OpenCV(三十四):轮廓外接最大、最小矩形和多边形拟合

目录 1.轮廓外接最大矩形boundingRect() 2.轮廓外接最小矩形minAreaRect() 3.轮廓外接多边形approxPolyDP() 1.轮廓外接最大矩形boundingRect() Rect cv::boundingRect ( InputArray array ) array:输入的灰度图像或者2D点集&#xff0c;数据类型为vector<Point>或者M…

Go语言的[GPM模型]

在go中,线程是运行Groutine的实体,调度器的功能是把可以运行的Groutine分配到工作线程上 GPM模型 M与P的数量没有绝对的数量关系,当一个M阻塞时,P就会创建一个或者切换到另一个M,所以即使设置了runtime.GOMAXPROCS(1) 也可能创建多个M出来; 当M发现给自己输送G协程的那个P队列为…

《AI一键生成抖音商品种草文案》让你秒变带货王!

在这个数字化的时代&#xff0c;我们的生活被各种应用所包围&#xff0c;其中&#xff0c;抖音作为一款短视频分享平台&#xff0c;已经成为了我们生活中不可或缺的一部分。然而&#xff0c;作为一名抖音创作者&#xff0c;你是否曾经遇到过这样的困扰&#xff1a;在创作商品种…

C#程序到底从哪里开始看,从Main函数开始,那么Main函数是什么?

视觉人机器视觉粉丝问我,拿到自己公司得架构,问我,C#程序到底从哪里看,从Main函数开始,那么Main函数是什么? Main()函数 Main()是C#应用程序的入口点,执行这个函数就是执行应用程序。也就是说,在执行过程开始时,会执行Main()函数,在Main()函数执行完毕时,执行过…

【JavaSpring】spring接口-beanfactory和applicationcontext与事件解耦

beanfactory 1.applicationcontext的父接口 2.是Spring的核心容器 功能 表面只有getBean&#xff0c;但实现类默默发挥了巨大作用 1.管理所有bean 2.控制反转 3.基本的依赖注入 applicationcontext 功能 1.继承了MessageSource&#xff0c;有了处理国际化资源的能力 …

[H5动画制作系列] Sprite及Text Demo

参考代码: sprite.js: var canvas, stage, container; canvas document.getElementById("mainView"); function init() {stage new createjs.Stage(canvas);createjs.Touch.enable(stage);var loader new createjs.LoadQueue(false);loader.addEventListener(&q…

云计算与虚拟化

一、概念 什么是云计算&#xff1f; 云计算&#xff08;cloud computing&#xff09;是分布式计算的一种&#xff0c;指的是通过网络“云”将巨大的数据计算处理程序分解成无数个小程序&#xff0c;然后&#xff0c;通过多部服务器组成的系统进行处理和分析这些小程序得到结果…

SLAM论文详解(5) — Bundle_Adjustment_LM(BALM)论文详解

目录 1 摘要 2 相关工作 3 BA公式和导数 A. 直接BA公式 B. 导数 C. 二阶近似 4 自适应体素化 5. 将BALM结合进LOAM 6. 实验 7. 算法应用场景解析 1 摘要 Bundle Adjustment是一种用于同时估计三维结构和传感器运动运动的优化算法。在视觉SLAM&#xff0c;三维重建等…

爬虫逆向实战(30)-某查查股东关联公司(HmacSHA512)

一、数据接口分析 主页地址&#xff1a;某查查 1、抓包 通过抓包可以发现数据接口是api/people/getRelatCompany 2、判断是否有加密参数 请求参数是否加密&#xff1f; 无 请求头是否加密&#xff1f; 通过查看“标头”可以发现&#xff0c;请求头中有一个key和value都是…

基于Sentinel的微服务保护

前言 Sentinel是Alibaba开源的一款微服务流控组件&#xff0c;用于解决分布式应用场景下服务的稳定性问题。Sentinel具有丰富的应用场景&#xff0c;它基于流量提供一系列的服务保护措施&#xff0c;例如多线程秒杀情况下的系统承载&#xff0c;并发访问下的流量控制&#xff…

9.8day59

503. 下一个更大元素 II - 力扣&#xff08;LeetCode&#xff09; 知识点&#xff1a;单调栈 42. 接雨水 - 力扣&#xff08;LeetCode&#xff09;

Qt的窗口系统

代码仓库以及参考文件见文章底部 坐标体系 要想学好GUI,界面的坐标系首先要搞清楚 在Qt编程中,以左上角为原点,X向右增加,Y向下增加。 对于所有嵌套的窗口,其坐标是相对于父窗口来说的。 QWidget 所有窗口以及窗口控件都是从QWidget直接或者间接派生出来的。 对象模…