二叉树oj题解析

二叉树

  • 二叉树的最近公共祖先
    • 什么是最近公共祖先?
    • leetcode中求二叉树中最近公共祖先
      • 解题1.
      • 解题2.
  • 根据二叉树创建字符串

二叉树的最近公共祖先

什么是最近公共祖先?


最近的公共祖先指的是这一棵树中两个节点中深度最大的且公共的祖先节点就是最近祖先节点。
也就是说这两个节点在树中距离最近的相交
例如:8 与6中的最近公共节点为2,因为他的最大深度就是2(在同一颗子树中)。
8与4的最近公共节点为3,因为他的最大深度是3(在左右两棵子树中的情况)。

在这里插入图片描述

leetcode中求二叉树中最近公共祖先

在这里插入图片描述

解题1.

公共祖先的三种形式:
1.题中可知:如果root根节点为q或者p,root这个节点就是最近的公共祖先节点。
2.如果p和q各自在原根节点的左右两棵子树中,则原根节点就是p和q的最近公共祖先。
3.如果p和q在根节点的同一颗子树中,则p和q的相遇之后两个节点最大深度且相交平行的第一个节点,就是最近公共祖先

在这里插入图片描述

  public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root==null)return null;//q或者p如果在其中的根节点上直接返回if(root==p||root==q)return root;//向左开始递归每一棵左右树TreeNode leftTree = lowestCommonAncestor(root.left,p,q);TreeNode rightTree= lowestCommonAncestor(root.right,p,q);//说明两棵树都不为nullif(leftTree!=null&&rightTree!=null){return root;}else if(leftTree!=null){return leftTree;}else{return rightTree;}}
}

解题2.

前面我们也说过p和p两个节点的最大深度就是它两个的最近公共祖先,也就是相交的节点,这里的B就是它们两个的公共祖先。
那我们为什么不能将两个节点的以相同的距离开始走,最后两个节点的值相同就是最近公共祖先

在这里插入图片描述
假如两个节点到最近公共祖先的距离相同。
我们可以创建两个栈分别来存储到达p和q距离的所有节点,假设距离相同后pop出栈,如果出栈过程中两个节点的值相同就是它两个的公共祖先了。
在这里插入图片描述
这里我们如果遇到了多余的子树节点就返回false,并将其出栈,然后继续找p或者q节点找到后直接返回true。
在这里插入图片描述

    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root==null)return null;Stack<TreeNode> stackP=new Stack<>();Stack<TreeNode> stackQ=new Stack<>();getTNodeLocation(root,stackP,p);getTNodeLocation(root,stackQ,q);//获取两个栈点的大小int sizeP=stackP.size();int sizeQ=stackQ.size();if(sizeP>sizeQ){int size = sizeP-sizeQ;while(size!=0){stackP.pop();size--;}}else{int size = sizeQ-sizeP;while(size!=0){stackQ.pop();size--;}}//找到两者的最近公共祖先while(!stackQ.isEmpty()&&!stackP.isEmpty()){if(stackQ.peek()==stackP.peek()){return stackQ.peek();}else{stackQ.pop();stackP.pop();}}return null;}//将指定的节点放入到栈中private boolean getTNodeLocation(TreeNode root,Stack stack,TreeNode t){//如果为null,返回给上一个节点falseif(root==null)return false;stack.push(root);//走一步放入栈一个节点if(root==t)return true;//这里root如果为t直接返回boolean judg1 =  getTNodeLocation(root.left,stack,t);if(judg1==true)return true;boolean judg2 =  getTNodeLocation(root.right,stack,t);if(judg2==true)return true;stack.pop();//这里将出多余的节点出栈return false;}

根据二叉树创建字符串

在这里插入图片描述
这里的题意:对二叉树根节点进行前序的遍历,将遍历到的子树通过括号括起来,如果左子树有节点但是右子树没有节点,则将多余的右子树的括号省略,当右子树有节点但是左子树没有节点时,将左子树节点的括号添加进去。
这里的条件是:1.左子树如果为空,右子树不为空时,左右子树都有括号。
2.左子树不为空时,右子树为空,则可以忽略右树括号。

在这里插入图片描述

   public String tree2str(TreeNode root) {StringBuilder sb=new StringBuilder();//通过StringBuilder来进行字符串的拼接tree2strChild(root,sb);return sb.toString();}public void tree2strChild(TreeNode root,StringBuilder sb){if(root==null)return ;sb.append(root.val);//将根节点放进去if(root.left!=null){sb.append("(");//左子树不为空加左括号tree2strChild(root.left,sb);sb.append(")");//左子树归时加右括号}else{//左树是空的,右树如果也为空就要加()if(root.right==null){return;}else{sb.append("()");}}if(root.right!=null){sb.append("(");tree2strChild(root.right,sb);sb.append(")");}else{return;}}

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=121ff85d13ss0

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

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

相关文章

优先算法 —— 双指针系列 - 移动零

1. 移动零 题目链接&#xff1a; 283. 移动零 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/move-zeroes/description/ 2. 算法原理 其实像移动零这种类型的题目都有一个名字叫做数组划分&#xff08;数组分块&#xff09;&#xff0c;就是说先给一个…

C语言——数组逐元素操作练习

定义一个能容纳10个元素的整形数组a&#xff0c;从键盘读取9个整数存放到前9个数组元素中。 一. 从键盘读取一个整数n和位置p(0<p<8)&#xff0c;插入n到数组a中&#xff0c;插入位置&#xff1a;下标p。要求插入点及后续的数组元素都要后移动。 代码如下&#xff1a; …

对抗样本存在的原因

对抗样本存在的原因与深度学习模型的结构和训练机制密切相关&#xff0c;主要包括以下几个方面&#xff1a; 1. 模型的高维性和线性化行为 高维性&#xff1a;深度学习模型通常在高维空间中运行&#xff0c;而高维空间中的数据分布非常稀疏。微小的扰动在高维空间可能被放大&a…

【ArcGISPro】根据yaml构建原始Pro的conda环境

使用场景 我们不小心把原始arcgispro-py3的conda环境破坏了,我们就可以使用以下方法进行修复 查找文件 在arcgis目录下找到yaml文件 如果没找到请复制以下内容到新的yaml文件 channels: - esri - defaults dependencies: - anyio=4.2.0=py311haa95532_0 - appdirs=1.4.4=p…

Java将PDF保存为图片

将 PDF 文件转换为图片是常见的需求之一&#xff0c;特别是在需要将 PDF 内容以图像形式展示或处理时。其中最常用的是 Apache PDFBox。 使用 Apache PDFBox Apache PDFBox 是一个开源的 Java 库&#xff0c;可以用来处理 PDF 文档。它提供了将 PDF 页面转换为图像的功能。 …

解决IDEA报包不存在,但实际存在的问题

前言 最近在把一个亿老项目交割给同事&#xff0c;同事在导入项目运行时遇到IDEA报包不存在&#xff0c;但实际存在的问题&#xff0c;最终通过以下方式解决 现象 在IDEA里启动运行项目&#xff0c;报某个类有问题&#xff0c;引入的包不存在。 点击这个引入的包&#xff0c;可…

Benchmark是什么?有什么作用?实例——助理解

benchmark 1、概念2、实例&#xff1a;2.1 背景&#xff1a;2.2 示例&#xff1a;GLUE Benchmark2.3 模型与 Benchmark 的关系 3、总结 1、概念 在论文中&#xff0c;benchmark 通常是指用于评估模型性能的标准化测试集合或基准工具。它通过提供一组统一的数据集和任务&#x…

debian 如何进入root

debian root默认密码, 在Debian系统中&#xff0c;安装完成后&#xff0c;默认情况下root账户是没有密码的。 你可以通过以下步骤来设置或更改root密码&#xff1a; 1.打开终端。 2.输入 sudo passwd root 命令。 3.当提示输入新的root密码时&#xff0c;输入你想要的密码…

使用uniapp编写APP的文件上传

使用uniapp插件文件选择、文件上传组件&#xff08;图片&#xff0c;视频&#xff0c;文件等&#xff09; - DCloud 插件市场 实用效果&#xff1a; 缺陷是只能一个一个单独上传

图算法 | 3、图分析与数据科学

图分析(Graph Analytics)在本质上是对图数据的处理与分析&#xff0c;其过程可以概括为图计算。 而图计算的范畴不仅包含数据的计算或分析&#xff0c;还包含元数据管理、模式管理、数据建模、数据清洗、转换、加载、治理、图分析与计算等一系列操作。 或许我们用大数据生命周…

66 mysql 的 表自增长锁

前言 mysql 的表锁之 AUTO_INC, 是我们自增长的时候做并发控制的锁 主要是用于 自增长生成新的 id 的时候的控制 在前面的文档中, 我们又看到 mysql 这边自增长的处理的相关的大概脉络 但是 对于一些 并发控制的细节, 我们当时 应该是直接忽略掉了 我们这里就来看一下…

GameFi的前景:游戏与金融的未来交汇点

随着区块链技术的迅速发展&#xff0c;GameFi&#xff08;游戏金融&#xff09;作为一种新兴的商业模式&#xff0c;正在重新定义游戏行业的未来。GameFi将游戏与去中心化金融&#xff08;DeFi&#xff09;结合&#xff0c;创造出一种全新的经济生态&#xff0c;吸引了大量玩家…

Vue 3 中 onUnload 和 onPageScroll 使用详解

Vue 3 中 onUnload 和 onPageScroll 使用详解 在 Vue 3 中&#xff0c;当我们开发微信小程序时&#xff0c;通常需要处理页面生命周期事件和页面滚动事件&#xff0c;比如页面卸载 (onUnload) 和页面滚动 (onPageScroll) 等。这些功能对优化用户体验、实现动态效果以及处理页面…

Unity 使用 Excel 进行配置管理(读Excel配置表、Excel转保存Txt 文本、读取保存的 Txt 文本配置内容)

Unity 使用 Excel 进行配置管理(读Excel配置表、Excel转保存Txt 文本、读取保存的 Txt 文本配置内容) 目录 Unity 使用 Excel 进行配置管理(读Excel配置表、Excel转保存Txt 文本、读取保存的 Txt 文本配置内容) 一、简单介绍 二、实现原理 三、注意事项 四、案例简单步…

Elasticsearch向量搜索:从语义搜索到图搜图只有一步之遥

续 上集说到语义搜索&#xff0c;这集接着玩一下图搜图&#xff0c;这种场景在电商中很常见——拍照搜商品。图搜图实现非常类似语义搜索&#xff0c;代码逻辑结构都很类似… 开搞 还是老地方modelscope找个Vision Transformer模型&#xff0c;这里选用vit-base-patch16-224…

HCIA笔记3--TCP-UDP-交换机工作原理

1. tcp协议 可靠的连接 1.1 报文格式 1.2 三次握手 1.3 四次挥手 为什么TIME_WAIT需要2MSL的等待时间&#xff1f; &#xff08;a&#xff09; 为了实现可靠的关闭 &#xff08;b&#xff09;为了让过期的报文在网络上消失 对于(a), 假设host发给server的last ack丢了。 ser…

docker搭建私有仓库,实现镜像的推送和拉取

1.拉取docker仓库镜像 docker pull registry 2.启动registry容器 docker run -d registry 3.查看当前仓库中存在的镜像&#xff08;一&#xff09; curl -XGET http://192.168.111.162: 5000/v2/_catalog 192.168.111.162 部署docker仓库宿主机的ip 5000 部署docker仓库映射到宿…

提取图片高频信息

提取图片高频信息 示例-输入&#xff1a; 示例-输出&#xff1a; 代码实现&#xff1a; import cv2 import numpy as npdef edge_calc(image):src cv2.GaussianBlur(image, (3, 3), 0)ddepth cv2.CV_16Sgray cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)grad_x cv2.Scharr(g…

kali安装过程中会遇到的问题和解决方法

在安装Kali Linux过程中&#xff0c;我们可能会遇到一些常见问题&#xff0c;这些问题及其解决方法如下&#xff1a; 1. 安装过程中卡住或停滞 问题描述: 安装过程卡在某一步&#xff0c;常见的如“Detecting hardware”或“Installing packages”阶段。 解决方法: 检查安装…

greater<>() 、less<>()及运算符 < 重载在排序和堆中的使用

简略图 greater<>()(a, b) a > b 返回true&#xff0c;反之返回false less<>()(a, b) a < b 返回true&#xff0c;反之返回false 在cmp中使用&#xff08;正着理解&#xff09; 规则返回true时a在前&#xff0c;反之b在前 在priority_queue中使用 &#xff…