剑指oferr68-II.二叉树的最近公共祖先

 为什么这道题的难度是easy,我感觉挺难的啊,我想了挺久没有一点思路就直接看题解了。题解有两种解法,先看第一种存储父节点

class Solution {Map<Integer,TreeNode> parent = new HashMap<Integer,TreeNode>();Set<Integer> visited = new HashSet<Integer>();public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {dfs(root);while(p != null){visited.add(p.val);p = parent.get(p.val);}while(q != null){if(visited.contains(q.val))return q;q = parent.get(q.val);}return null;}private void dfs(TreeNode root){if(root.left != null){parent.put(root.left.val, root);dfs(root.left);}if(root.right != null){parent.put(root.right.val, root);dfs(root.right);}}}

它是用一个parent的HashMap来存储所有节点的父节点,HashMap键值对的类型是<Integer,TreeNode>,Integer是子节点的值,TreeNode是父节点的引用,然后利用parent.get(p.val)的方法获得p的父节点,然后把父节点的值放入一个叫visited的set里面,然后

p = parent.get(p.val),p就变成了他的父节点,在循环一次就把,p的爷爷节点的值放进了set,

对于q而言,就直接看set里面有没有q.val,如果有说明q是p的祖宗,直接返回q就可以,如果没有,q就变成他的父节点,再看set里面有没有,这样一直循环就会找到p和q的最近祖先。

还有一种方法是递归。

class Solution {private TreeNode ans;public Solution(){this.ans = null;}public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {dfs(root, p, q);return this.ans;}private boolean dfs(TreeNode root, TreeNode p, TreeNode q){if(root == null) return false;boolean lson = dfs(root.left, p, q);boolean rson = dfs(root.right, p, q);if((lson && rson) || ((root.val == p.val || root.val == q.val) && (lson || rson))){ans = root;}return lson || rson || (root.val == p.val) || (root.val == q.val);}
}

 如果x是p,q的最近公共祖先,那么{x的左子树包含p右子树包含q(左子树包含q右子树包含p)}或者{[x是p x的左子树包含q(右子树包含p)] [x是q x的左子树包含p(x的右子树包含p)]},x只存在大括号这两种情况。因为如果x是最近公共祖先的话,x的一颗子树上不可能同时存在p和q(如果同时存在,那么最近的公共祖先不是x而是x的子孙)这个解释的是第一个大括号,如果x是p的话,那么q一定在x的左子树或者右子树上  解释的是第二个大括号。逻辑搞清楚了,接下来看代码,dfs采用的是左右根的遍历方式。dfs可以看作是自下而上用来标记每个子树是true还是false的方法,如果它的值等于p或q那么他就是true,或者他的左子树或者右子树是true那么他就是true,并且在遍历的同时还会判断这个节点是不是最近公共祖先,判断的方法就是刚才讲的大括号的两种情况,因为是自下而上的,所以最先找到的公共祖先就是最近公共祖先,当找到了这个最近公共祖先后,它也被设置成了true,但是他的兄弟不可能是true,因为pq都在x这边,这样的话对于x的父节点,根据判断条件,flson&&frson是fasle,第二种情况也是false,也就是说x的父节点不可能是最近公共祖先,但是它被标记为了true,但是x的父节点的兄弟不可能是true,因为pq都在x的父节点这边,以此类推可以得出,x的兄弟节点和他的祖先节点都不会变成最近公共祖先。

这个方法逻辑性太强了,我理了半个多小时才把这个逻辑搞清楚,不如方法一容易理解,但是确实很巧妙。

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

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

相关文章

14.live555mediaserver-play请求与响应

live555工程代码路径 live555工程在我的gitee下&#xff08;doc下有思维导图、drawio图&#xff09;&#xff1a; live555 https://gitee.com/lure_ai/live555/tree/master 章节目录链接 0.前言——章节目录链接与为何要写这个&#xff1f; https://blog.csdn.net/yhb1206/art…

Web APIs

文章目录 1.Web APIs 和 JS 基础关联性1.1 JS 的组成 2. API 和 Web API2.1 API2.2 Web API 1.Web APIs 和 JS 基础关联性 1.1 JS 的组成 2. API 和 Web API 2.1 API **API&#xff08;Application Programming Interface,应用程序编程接口&#xff09;**是一些预先定义的函…

关于cip.cc查IP出口地址的工具到底准确不准确?

关于 cip.cc 或其他在线IP查询工具的准确性&#xff0c; 首先来看2张图片&#xff0c;分别如下 实际情况就是作者在杭州&#xff0c;使用的网络出口地址应该是百度的&#xff0c;而不是cip.cc所显示的地址。 所以结论是cip.cc并不靠谱&#xff0c;我又查阅了相关资料如下 1.…

2023-07-14:讲一讲Kafka与RocketMQ中存储设计的异同?

2023-07-14&#xff1a;讲一讲Kafka与RocketMQ中存储设计的异同&#xff1f; 答案2023-07-14&#xff1a; 在Kafka中&#xff0c;文件的布局采用了Topic/Partition的方式&#xff0c;每个分区对应一个物理文件夹&#xff0c;且在分区文件级别上实现了顺序写入。然而&#xff0…

【JavaEE】HTTP协议和抓包工具的使用

目录 1、HTTP的概述和抓包工具的使用 1.1、HTTP是什么 1.2、了解HTTP协议的工作过程 1.3、抓包工具的使用 1.3.1、抓包工具在HTTP传输时的工作原理 1.3.2、Fiddler抓包工具的下载和使用 2、HTTP协议格式 2.1、HTTP 请求格式 2.1.1.基本格式 2.1.2、了解HTTP请求包中的…

【动手学习深度学习--逐行代码解析合集】19含并行连结的网络(GoogleNet)

【动手学习深度学习】逐行代码解析合集 19含并行连结的网络&#xff08;GoogleNet&#xff09; 视频链接&#xff1a;动手学习深度学习–含并行连结的网络&#xff08;GoogleNet&#xff09; 课程主页&#xff1a;https://courses.d2l.ai/zh-v2/ 教材&#xff1a;https://zh-v…

prometheus调整默认数据存储时间

调整kubernetes部署的prometheus数据存储时间 由于prometheus是用kuberentes部署的&#xff0c;没办法像传统部署方式那种直接在启动参数增加存储时间的参数。需要在configmap里或者在deployment里添加&#xff0c;我这里使用的方式是在deployement里添加调整存储时间的参数。…

【Linux】进程信号

文章目录 1. 信号的理解1.1 什么是进程信号1.2 见见进程信号1.3 信号的发送与记录1.4 信号的处理1.4.1 信号的三种处理方式1.4.2 核心转储 2. 信号的产生2.1 终端按键产生信号2.2 系统调用产生信号2.3 软件异常产生信号2.4 硬件异常产生信号 3. 信号的保存3.1 信号其他相关概念…

git clone 或者是vscode clone 时遇到the remote end hung up unexpectedly

fatal: the remote end hung up unexpectedly fatal: early EOF fatal: index-pack failed使用git clone总是报错 查看原因有三种可能&#xff1a;要么是缓存不够&#xff0c;要么是网络不行&#xff0c;要么墙的原因。 如果是网络不行&#xff0c;可以配置git的最低速度和最…

基于Python+Django+mysql+html学生成绩管理系统

基于PythonDjangomysqlhtml学生成绩管理系统 一、系统介绍二、功能展示1.用户登陆2.主页3.年级管理4.班级管理5.课程管理6.学生管理7.班级管理8.学生管理 三、其它系统四、获取源码 一、系统介绍 成绩录入测试账号&#xff1a;test 密码&#xff1a;123 在线成绩录入&#xff…

pandas的DataFrame转存MATLAB的mat格式

有的时候需要把 pandas 处理好的 DataFrame 进一步交给MATLAB来处理。当然可以保存成 excel 文件&#xff0c;不过当数据量比较大的时候&#xff0c;读取比较慢&#xff0c;这个时候转存成 MATLAB 可读的 mat 文件更合适&#xff08;MATLAB 能快速读取&#xff09;。 标准的操…

Deepin/UOS Linux 桌面自定义 IDEA/DataGrip 应用程序图标

在 $HOME/Desktop目录下编辑 vim jetbrains.intelij.idea.desktop [Desktop Entry] TypeApplication NameIntelij IDEA Icon/opt/module/idea-IU-203.8084.24/bin/idea.png Exec/opt/module/idea-IU-203.8084.24/bin/idea.sh Terminalfalse CategoriesDevelopment;IDE;vim je…