LeetCode——二叉树篇(五)

news2024/9/23 13:15:57

 刷题顺序及思路来源于代码随想录,网站地址:https://programmercarl.com 

目录

404. 左叶子之和

513. 找树左下角的值

递归 

 迭代

112. 路径总和

113. 路径总和 II


404. 左叶子之和

给定二叉树的根节点 root ,返回所有左叶子之和。

/**
 * @author light
 * @Description 左叶子之和
 * 给定二叉树的根节点 root ,返回所有左叶子之和。
 *
 * (判断该节点是否是左叶子不能靠当前结点判断,而是靠父节点其左孩子是不是来判断的
 * @create 2023-08-19 10:17
 */
public class SumOfLeftLeavesTest {
	public static int sumOfLeftLeaves(TreeNode root) {
		//终止条件
		if(root==null){
			return 0;
		}
		//只有当前遍历的结点是父节点时,才能判断其子节点是否是左叶子
		if(root.left==null&&root.right==null){
			return 0;
		}
		//后序遍历
		int leftNum=sumOfLeftLeaves(root.left); //左
		if(root.left!=null&&root.left.left==null&&root.left.right==null){
			leftNum=root.left.val;
		}
		int rightNum=sumOfLeftLeaves(root.right); //右
		int sum=leftNum+rightNum;//中
		return sum;
	}
}

513. 找树左下角的值

给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。

假设二叉树中至少有一个节点。

递归 

/**
 * 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  int maxDepth=Integer.MIN_VALUE; //记录最大深度
	public  int value;
    public int findBottomLeftValue(TreeNode root) {
        findValue(root,0);
		return value;
    }
    private  void findValue(TreeNode root, int depth) {
		if(root.left==null&&root.right==null){
			if(maxDepth<depth){
				maxDepth=depth;
				value= root.val;
			}
		}
		if(root.left!=null){
			depth++;
			findValue(root.left,depth);
			depth--;
		}
		if(root.right!=null){
			depth++;
			findValue(root.right,depth);
			depth--;
		}
	}
}

 迭代

层序遍历,记录最后一层第一的节点即可

/**
 * 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 int findBottomLeftValue(TreeNode root) {
			int value=0;
		if(root==null){
			return value;
		}
		Deque<TreeNode> que=new ArrayDeque<>();
		que.offer(root);
		while(!que.isEmpty()){
			int size=que.size();
			int count=size;
			while(size>0){
				TreeNode node=que.poll();
				if(count==size){
					value= node.val;
				}
				if(node.left!=null){
					que.offer(node.left);
				}
				if(node.right!=null){
					que.offer(node.right);
				}
				size--;
			}
		}
		return value;
		}
}

112. 路径总和

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

叶子节点 是指没有子节点的节点。

/**
 * @author light
 * @Description 路径总和
 *
 * (不要去累加然后判断是否等于目标和,那么代码比较麻烦,可以用递减,
 * 让计数器count初始为目标和,然后每次减去遍历路径节点上的数值。
 *
 * 如果最后count == 0,同时到了叶子节点的话,说明找到了目标和。
 *
 * 如果遍历到了叶子节点,count不为0,就是没找到。
 * @create 2023-08-19 11:48
 */
public class HasPathSumTest {

	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){
			targetSum-=root.left.val;
			boolean left=hasPathSum(root.left,targetSum);
			if(left){
				return true; //找到了
			}
			targetSum+=root.left.val;
		}
		if(root.right!=null){
			targetSum-=root.right.val;
			boolean right=hasPathSum(root.right,targetSum);
			if(right){
				return true; //找到了
			}
			targetSum+=root.right.val;
		}
		return false;
	}


}

113. 路径总和 II

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

叶子节点 是指没有子节点的节点。

/**
 * 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 List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        List<List<Integer>> res=new ArrayList<>(); //存放结果集      
        List<Integer> path=new ArrayList<>(); //存放路径变量  
				if(root==null){
					return res;
				}        
        getPaths(root,targetSum,path,res);                      
        return res;                                             
    }
  private void getPaths(TreeNode root, int targetSum, List<Integer> path, List<List<Integer>> res) {
		path.add(root.val);
		if(root.left==null&&root.right==null){
			if(targetSum-root.val==0){
				res.add(new ArrayList<>(path));
			}
			return;
		}
		if(root.left!=null){
			targetSum-=root.val;
			getPaths(root.left,targetSum,path,res);
			path.remove(path.size()-1);
			targetSum+=root.val;
		}
		if(root.right!=null){
			targetSum-=root.val;
			getPaths(root.right,targetSum,path,res);
			path.remove(path.size()-1);
			targetSum+=root.val;
		}

	}
}

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

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

相关文章

【数据结构】如何用队列实现栈?图文详解(LeetCode)

LeetCode链接&#xff1a;225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 本文默认读者已经掌握栈与队列的基本知识 或者先看我的另一篇博客&#xff1a;【数据结构】栈与队列_字节连结的博客-CSDN博客 做题思路 由于我们使用的是C语言&#xff0c;不能直接使用队…

前端 -- 基础 网页、HTML、 WEB标准 扫盲详解

什么是网页 : 网页是构成网站的基本元素&#xff0c;它通常由 图片、链接、文字、声音、视频等元素组成。 通常我们看到的网页 &#xff0c;常见以 .html 或 .htm 后缀结尾的文件&#xff0c; 因此俗称 HTML 文件 什么是 HTML : HTML 指的是 超文本标记语言&#xff0c…

基于单片机DHT11温湿度NRF2401无线通信控制系统

一、系统方案 本设计采用STC89C5单片机作为主控制器&#xff0c;从机采用DHT11传感器采集温湿度、按键设置报警阀值&#xff0c;液晶1602显示&#xff0c;蜂鸣器报警&#xff0c;无线NRF2401模块。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统…

SQL-每日一题【1527. 患某种疾病的患者】

题目 患者信息表&#xff1a; Patients 查询患有 I 类糖尿病的患者 ID &#xff08;patient_id&#xff09;、患者姓名&#xff08;patient_name&#xff09;以及其患有的所有疾病代码&#xff08;conditions&#xff09;。I 类糖尿病的代码总是包含前缀 DIAB1 。 按 任意顺序…

aardio开发语言Excel数据表读取修改保存实例练习

import win.ui; /*DSG{{*/ var winform win.form(text"aardio form";right759;bottom479) winform.add( buttonEnd{cls"button";text"末页";left572;top442;right643;bottom473;z6}; buttonExcelRead{cls"button";text"读取Exce…

基于Java/springboot铁路物流数据平台的设计与实现

摘要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;铁路物流数据平台当然也不能排除在外&#xff0c;从文档信息、铁路设计的统计和分析&#xff0c;在过程中会产生大量的、各…

云原生反模式

通过了解这些反模式并遵循云原生最佳实践&#xff0c;您可以设计、构建和运营更加强大、可扩展和成本效益高的云原生应用程序。 1.单体架构&#xff1a;在云上运行一个大而紧密耦合的应用程序&#xff0c;妨碍了可扩展性和敏捷性。2.忽略成本优化&#xff1a;云服务可能昂贵&am…

攻防世界-Training-WWW-Robots

原题 解题思路 robots.txt是网站的爬虫声明&#xff0c;说明允许哪些部分被爬取&#xff0c;进robots.txt看看。 f1.g.php不让看&#xff0c;进去看看。

AWS复制EC2文件到S3,g4dn.2xlarge没有NVIDIA GPU 驱动问题

1、给instances权限 action > Security > modify IAM role 把提前创建好的role给这个instance即可 2、复制到bucket aws s3 cp gogo.tar.gz s3://ee547finalbucket不需要手动安装GPU驱动 如果要自己安装&#xff0c;参考https://docs.aws.amazon.com/AWSEC2/latest/U…

snpEff变异注释的一点感想

snpEff变异注释整成人生思考 1.介绍2.安装过程以及构建物种参考数据库3.坑货来了4.结果文件判读5.小tips 1.介绍 &nbsp SnpEff&#xff08;Snp Effect&#xff09;是一个用于预测基因组变异&#xff08;例如单核苷酸变异、插入、缺失等&#xff09;对基因功能的影响的生物…

嵌入式开发之configure

1 前述 在Linux的应用或者驱动开发过程中&#xff0c;编写makefile是无法避免的问题&#xff0c;但是由于makefile的各种规则&#xff0c;或显式&#xff0c;或隐式&#xff0c;非常多&#xff0c;不经常写的话&#xff0c;很难写出一个可用的makefile文件。为了“偷懒”&…

07_缓存预热缓存雪崩缓存击穿缓存穿透

缓存预热&缓存雪崩&缓存击穿&缓存穿透 一、缓存预热 提前将数据从数据库同步到redis。 在程序启动的时候&#xff0c;直接将数据刷新到redis懒加载&#xff0c;用户访问的时候&#xff0c;第一次查询数据库&#xff0c;然后将数据写入redis 二、缓存雪崩 发生情…

Python 的下一代 HTTP 客户端

迷途小书童 读完需要 9分钟 速读仅需 3 分钟 1 环境 windows 10 64bitpython 3.8httpx 0.23.0 2 简介 之前我们介绍过使用 requests ( https://xugaoxiang.com/2020/11/28/python-module-requests/ ) 来进行 http 操作&#xff0c;本篇介绍另一个功能非常类似的第三方库 httpx&…

深入探索JavaScript中的5种经典算法

在本文中&#xff0c;您将了解到&#xff1a; 冒泡排序、快速排序等常见排序算法原理及其在 JavaScript 中的实现&#xff1b; 经典算法示例 1. 冒泡排序算法 冒泡排序算法&#xff1a;冒泡排序是一种简单但效率较低的排序算法。它通过多次遍历数组&#xff0c;比较相邻元素并…

JVM前世今生之JVM内存模型

JVM内存模型所指的是JVM运行时区域&#xff0c;该区域分为两大块 线程共享区域 堆内存、方法区&#xff0c;即所有线程都能访问该区域&#xff0c;随着虚拟机和GC创建和销毁 线程独占区域 虚拟机栈、本地方法栈、程序计数器&#xff0c;即每个线程都有自己独立的区域&#…

生成式AI系列 —— DCGAN生成手写数字

1、模型构建 1.1 构建生成器 # 导入软件包 import torch import torch.nn as nnclass Generator(nn.Module):def __init__(self, z_dim20, image_size256):super(Generator, self).__init__()self.layer1 nn.Sequential(nn.ConvTranspose2d(z_dim, image_size * 32,kernel_s…

基于web的停车场收费管理系统/基于springboot的停车场管理系统

摘 要 随着汽车工业的迅猛发展&#xff0c;我国汽车拥有量急剧增加。停车场作为交通设施的组成部分,随着交通运输的繁忙和不断发展&#xff0c;人们对其管理的要求也不断提高&#xff0c;都希望管理能够达到方便、快捷以及安全的效果。停车场的规模各不相同,对其进行管理的模…

深入理解ASP.NET Core中的Program类和Startup类

一、背景介绍 本文以ASP.NET Core 6以前版本API程序来说明。 在我们新建ASP.NET Core项目时&#xff0c;项目根目录下会自动建立Program.cs和Startup.cs两个类文件。 Program.cs 作为 Web 应用程序的默认入口&#xff0c;不做任何修改的情况下&#xff0c;会调用同目录下 Star…

Dubbo 融合 Nacos 成为注册中心

快速上手 Dubbo 融合 Nacos 成为注册中心的操作步骤非常简单&#xff0c;大致步骤可分为“增加 Maven 依赖”以及“配置注册中心“。 增加 Maven 依赖 只需要依赖Dubbo客户端即可&#xff0c;关于推荐的使用版本&#xff0c;请参考Dubbo官方文档或者咨询Dubbo开发人员&#…

Vue 2 组件基础

一个简单的组件示例&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…