二叉树相关算法

满二叉树:每层都是满的

完全二叉树:特殊的满二叉树,可以有一个子节点,但最后一层必须是从左到右排列,中间不能有空隙,强调除了最后一层外,其他层都是满的

一、dfs深度搜索 

例题:求树的深度、树的中序遍历、树的直径、二叉树的最近公共祖先、二叉树中的最大路径和

dfs思想:都是基于递归,将大问题化解成子问题

1、树的深度

求一颗树的深度 - >求当前节点的深度,再将当前深度返回+1【包括本身Node对象】

// 本题,将求整颗树的深度转化为求各节点的深度,保证每次节点的深度都是最大值,
// 那么最终取得的就是最大值// 不需要去设个全局变量去保留最大值的副本 public int maxDepth(TreeNode root) {if(root == null)return 0;int r1 = maxDepth(root.left);int r2 = maxDepth(root.right);return Math.max(r1,r2)+1;}

2、二叉树的最近公共祖先

思路:从叶子节点开始,如果是目标对象所在的路径标记为1,否则标记为0,第一个能凑到2的节点就是最近公共祖先。

class Solution {
// 设置一个变量,去保存最近公共祖先TreeNode res;public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {// 这里重载方法的返回值dfs(root,p,q);return res;}private int dfs(TreeNode root,TreeNode p,TreeNode q){if(root==null)return 0;int c = (root == q || root == p)?1:0;int r1 = dfs(root.left,p,q);int r2 = dfs(root.right,p,q);
// 这里表明当前 root 就是最近公共祖先,直接将其赋值给全局变量resif(r1+r2+c == 2) res = root;return (r1+r2+c==1) ?1 :0;}
}

另一种写法:

详见 递归方法寻找二叉树任意的两个节点的最近公共祖先 含代码展示和思路讲解_哔哩哔哩_bilibili

思想:本质同上面一样,我们这里是将子节点不满足条件(所在链路中不含有目标节点)的都标记为null,那么如果某条链路中含有目标节点 p/ q,则被标记为left / right,第一个收集齐left和right的就是最近公共祖先

  public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root == null) return null;if(root == p || root == q) return root;TreeNode left = lowestCommonAncestor(root.left,p,q);TreeNode right = lowestCommonAncestor(root.right,p,q);if(null == left && null == right) return null;else if(null == left && null != right) return right;else if(null != left && null == right) return left;return root;}

3、二叉树的直径

思想:也是将 求整颗树的直径转换为 子节点中,经过该节点的最大路径
同时,当前节点后面也将成为父亲的子节点,经过父节点的最大路径是依赖于子节点的最长链路
(子节点的左子树or右子树,通过max方法取最长的)
同时注意,最大路径的两端一定是叶子节点

class Solution {private int ans;public int diameterOfBinaryTree(TreeNode root) {dfs(root);return ans;}// 思路:// 逐个遍历每个点,计算该点拐弯,计算直径的值,并保存一份,// 同时这个点作为父亲的子节点,如果父亲有望成为拐点,需要依靠孩子的最长链路(孩子的左子树or右子树取最大值)// 递归解决...private int dfs(TreeNode root){if(root==null) return -1;// 枚举每个点,假设在该点拐弯,计算当前节点左子树和右子树的深度// 同时,直径的两端必定是叶子节点int lLen = dfs(root.left);int rLen = dfs(root.right);// 逐个遍历,求出最大值 ,记得加2,因为本身到左右子节点还有2ans = Math.max(ans,lLen+rLen+2);// 返回给父节点的值:左右链的最大值,记得加1,因为还要包含本身return Math.max(lLen,rLen)+1;}
}

4、二叉树中的最大路径和

这题思路和上题一样,通过求经过每个点的最大路径和
注意,如果val为负数的话,我们直接返回0
同时注意,在创建sum变量的时候,赋一个无穷小的数值,避免二叉树的val全是负数的特殊情况

class Solution {int sum = Integer.MIN_VALUE;public int maxPathSum(TreeNode root) {dfs(root);return sum;}private int dfs(TreeNode root){// 到了叶子节点,直接返回0 (递归边界)if(root == null) return 0;// 计算出当前节点的左右子树int r1 = dfs(root.left);int r2 = dfs(root.right);// 算出当前节点的最大贡献值,即左右子树+自身// 并和当前最大值进行比较,如果小于的话 直接丢弃sum = Math.max(sum,r1+r2+root.val);// 返回的话,直接将当前节点与左右子树中较大的那个返回回去,作为父节点的一颗链// 同时注意和0进行比较,如果小于0,直接舍弃,即置为0return Math.max(Math.max(r1,r2)+root.val,0);}
}

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

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

相关文章

Sigrity Power SI VR noise Metrics check模式如何进行电源噪声耦合分析操作指导

SSigrity Power SI VR noise Metrics check模式如何进行电源噪声耦合分析操作指导 Sigrity Power SI的VR noise Metrics check模式本质上是用来评估和观测器件的电源网络的耦合对于信号的影响,输出S参数以及列出具体的贡献值。 以下图为例

OpenGL入门004——使用EBO绘制矩形

本节将利用EBO来绘制矩形 文章目录 一些概念EBO 实战简介utilswindowFactory.hRectangleModel.hRectangleModel.cpp main.cppCMakeLists.txt最终效果 一些概念 EBO 概述: Element Buffer Object 用于存储顶点的索引数据,以便在绘制图形时可以重用顶点数…

Qt 视口和窗口

Qt 视口和窗口 1、视口和窗口的定义与原理 绘图设备的物理坐标是基本的坐标系,通过 QPainter 的平移、旋转等变换可以得到更容易操作的逻辑坐标。 为了实现更方便的坐标,QPainter 还提供了视口 (Viewport)和窗口 (Window)坐标系,通过Q…

hunyuan-DiT模型部署指南

一、介绍 Hunyuan-DiT是由腾讯混元推出的扩散模型,支持中文和英文双语输入,其他开源模型相比,Hunyuan-DiT 在中文到图像生成方面树立了新的水平。 二、部署流程 环境要求: 所需的最小 GPU 内存为 11GB, 建议使用具…

Pytorch学习--神经网络--搭建小实战(手撕CIFAR 10 model structure)和 Sequential 的使用

一、Sequential 的使用方法 在手撕代码中进一步体现 torch.nn.Sequential 二、手撕 CIFAR 10 model structure 手撕代码: import torch from torch import nn from torch.nn import Conv2d, MaxPool2d, Flatten, Linear from torch.utils.tensorboard import Su…

硬件测试工程师之EMC项目-电磁干扰-谐波测试标准解析思维导图

1:链接上一篇文章 ​​​​​​​相关链接:https://blog.csdn.net/weixin_49492286/article/details/135210741 2:重新总结思维导图并进行深入解析EMC-谐波测试项目 本人重新再次总结这个EMC谐波的标准解析思维导图,并且附上相…

ArcGIS 地理信息系统 任意文件读取漏洞复现

0x01 产品简介 ArcGIS是由美国Esri公司研发的地理信息系统(GIS)软件,它整合了数据库、软件工程、人工智能、网络技术、云计算等主流的IT技术,旨在为用户提供一套完整的、开放的企业级GIS解决方案,它包含了一套带有用户界面组件的Windows桌面应用。可以实现从简单到复杂的…

安全合规:沃尔玛自养号测评技术搭建要点

沃尔玛自养号测评技术的搭建是一个复杂且需综合考量多方面因素的过程,以下是对其技术搭建的详细解析: 一、硬件与网络环境搭建 硬件参数伪装: 利用国外服务器在云端搭建安全终端,全面阻断沃尔玛平台对设备底层硬件参数的检测&a…

Ps:天空替换

Ps菜单:编辑/天空替换 Edit/Sky Replacement Ps菜单:选择/天空 Select/Sky 天空替换 Sky Replacement命令能够自动分析前景与天空,利用 Adobe Sensei 技术也大大减轻了制作蒙版的负担,可以直观、智能、快速地实现天空替换。 到目…

【JavaEE初阶】网络编程TCP协议实现回显服务器以及如何处理多个客户端的响应

前言 🌟🌟本期讲解关于TCP/UDP协议的原理理解~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆那么废话不多说…

MySQL 9从入门到性能优化-加密函数

【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-CSDN博客 《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…

探索空间计算与 VR 设备的未来:4K4DGen 高分辨率全景 4D 内容生成系统

在当今科技飞速发展的时代,空间计算和 VR 设备正逐渐成为人们体验沉浸式场景的重要工具。而今天,我们要为大家介绍一款具有创新性的技术 ——4K4DGen 高分辨率全景 4D 内容生成系统,它为 VR/AR 沉浸式体验带来了全新的可能性。 一、项目概述 4K4DGen 项目的核心目标是实现 …

Unity中实现伤害飘字或者提示飘字效果(DoTween实现版本)

!!!在实现以下效果之前,一定要往项目中导入DoTween插件。 一、搭建测试场景 1、在场景中新建一个带有Text组件的游戏物体A,并把这个游戏物体A中Text组件的Color属性中alpha值为0,让文字在场景中隐藏。 …

为什么说模拟电路的难点就在开通过程和关断过程?难在什么地方?

模拟电路中开通过程和关断过程之所以困难,主要有以下几个方面的原因: 1. 瞬态响应特性复杂 - 在开通和关断瞬间,电路中的电流和电压会发生快速变化,产生复杂的瞬态响应。这些瞬态响应可能包含过冲、下冲、振铃等现象,…

数据结构---二叉树(顺序结构),堆(上)

树 树的概念与结构 树是⼀种⾮线性的数据结构,它是由 n(n>=0) 个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下的。 PS 有⼀个特殊的结点,称为根结点,根结点没有前驱结点。除根结点外,其余结点被分成…

CSS中常见的两列布局、三列布局、百分比和多行多列布局!

目录 一、两列布局 1、前言: 2. 两列布局的常见用法 两列布局的元素示例: 代码运行后如下: 二、三列布局 1.前言 2. 三列布局的常见用法 三列布局的元素示例: 代码运行后如下: 三、多行多列 1.前言 2&…

发现了NitroShare的一个bug

NitroShare 是一个跨平台的局域网开源网络文件传输应用程序,它利用广播发现机制在本地网络中找到其他安装了 NitroShare 的设备,从而实现这些设备之间的文件和文件夹发送。 NitroShare 支持 Windows、macOS 和 Linux 操作系统。 NitroShare允许我们为…

新世联科技:NG2-A-7在DAC空气捕集提取CO2的应用

一、DAC空气捕集提取CO2的介绍 直接空气碳捕获(Direct Air Capture,简称DAC)是一种直接从大气中提取二氧化碳的技术。 二、DAC空气捕集提取CO2的前景 从大气中提取的这种二氧化碳可以作为循环经济的一部分以各种不同方式使用。未来&#xf…

ABAP开发学习——OLE常用方法和属性

ABAP开发学习——OLE-CSDN博客 OLE常用方法和属性

如何学习Java“高并发”,并在项目中实际应用?

高并发编程 提到并发编程很多人就会头疼了;首先就是一些基础概念:并发,并行,同步,异步,临界区,阻塞,非阻塞还有各种锁全都砸你脸上,随之而来的就是要保证程序运行时关键…