当前位置:网站首页>LeetCode 练习——关于二叉树的最近公共祖先两道题
LeetCode 练习——关于二叉树的最近公共祖先两道题
2022-07-23 01:13:00 【SK_Jaco】
1. 二叉搜索树的最近公共祖先
1.1 题目描述
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]
示例 1:
输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
输出: 6
解释: 节点 2 和节点 8 的最近公共祖先是 6。
示例 2:
输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
输出: 2
解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。
1.2 解题思路与代码
1.2.1 解题思路
这道题需要抓住重点:搜索二叉树,那么这道题就比较简单了,我们使用递归遍历二叉树。当我们遍历一个节点时对于给定的两个节点 p 和 q 只会出现三种情况:
- p 和 q 的值都比当前节点小,即 p 和 q 都在当前节点的左子树上,此时我们就往 left 上继续遍历;
- p 和 q 的值都比当前节点大,即 p 和 q 都在当前节点的右子树上,此时我们就往 right 上继续遍历;
- p 比当前节点大 q 比当前节点小或者p 比当前节点小 q 比当前节点大,即此时 p 和 q 分别在当前节点的左右子树上,则当前节点便是 p 和 q 的公共祖先
1.2.2 代码
class Solution {
TreeNode node = null;
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
process(root,p,q);
return node;
}
public void process(TreeNode root, TreeNode p, TreeNode q) {
if (root == null) {
return;
}
if (root.val < p.val && root.val < q.val) {
process(root.right, p, q);
} else if (root.val > p.val && root.val > q.val) {
process(root.left, p, q);
} else {
node = root;
return;
}
}
}
1.3 测试结果
通过测试
2. 二叉树的最近公共祖先
2.1 题目描述
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
示例 1:
输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点 5 和节点 1 的最近公共祖先是节点 3 。
示例 2:
输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出:5
解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。
示例 3:
输入:root = [1,2], p = 1, q = 2
输出:1
2.2 解题思路与代码
2.2.1 解题思路
遇上一道题不同的是,这道题就是一个普通的二叉树,节点上就不存在大小关系了,不能再用上面的思路。那么我们可以先递归遍历整个二叉树,并使用 map 存放当前节点和父节点的映射。二叉树遍历完成之后然后从 map 中获取 p 节点开始依次向上遍历,并使用集合存放遍历的路径。然后再从 map 中获取 q 节点并依次向上遍历,当在 p 的路径集合中到找到 q 向上遍历的节点时,便找到了公共祖先。即从 p 节点和 q 节点往上便利,当遇到第一个相同节点时,便是公共祖先。
2.2.2 代码
class Solution {
Map<TreeNode, TreeNode> map = new HashMap<>();
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
process(null, root);
Set<TreeNode> set = new HashSet<>();
while (p != null) {
set.add(p);
p = map.get(p);
}
while (!set.contains(q)){
q = map.get(q);
}
return q;
}
public void process(TreeNode parent, TreeNode node) {
if (node == null) {
return;
}
if (parent != null) {
map.put(node, parent);
}
process(node, node.left);
process(node, node.right);
}
}
2.3 测试结果
通过测试
3.总结
- 二叉搜索树的公共祖先查找相对比较简单直接遍历二叉树,如果 p 节点和 q 节点分别在当前节点的左右子树上,则当前节点便是公共祖先
- 普通二叉搜索树的公共祖先查找就是从 p 节点和 q 节点网上遍历,当两条路径第一次相遇时,便是公共祖先
边栏推荐
- 在通达信开户安全不
- 实行自动化网络性能监控的优势
- Compose与RecyclerView结合效果会是怎样的?
- 解读随着教育改革的深入steam教育
- Software testing interview ideas, skills and methods to share, learn is to earn
- 2302. 统计得分小于 K 的子数组数目-滑动数组-双百代码
- 1646. 获取生成数组中的最大值递归法
- LiveQing直播RTMP点播视频流媒体平台如何携带登录接口返回的sid和token接口调用鉴权streamToken视频流鉴权
- PMP一手资料、一手资讯获取
- Internet download manager is simply a killer of downloaders
猜你喜欢

事件侦听和删除事件——event对象——默认事件——取消冒泡事件——事件委托——默认触发

Summary of some open source libraries that drive MCU hardware debugger (including stlink debugger)

PMP备考心得 | 好的习惯、好的过程、好的结果

【MySQL从入门到精通】【高级篇】(七)设计一个索引&InnoDB中的索引方案

Solve the greatest common divisor and the least common multiple

C语言实战之猜数游戏

如何高效系统学习 MySQL?

Mathematical modeling interpolation fitting

Advantages of implementing automatic network performance monitoring

一个月学透阿里整理的分布式架构笔记
随机推荐
华为应用已经调用了checkAppUpdate接口,为什么应用内不提示版本更新
妙啊!美团 OCTO 分布式服务治理系统,这描述也太清晰了
SQL用户表的通用设计
. net to develop cloud native applications, you only need to add oil to yourself
FasterRCNN示例代码测试1:令anchor_generator = None
Flutter linear layout, filling
LiveQing直播RTMP点播视频流媒体平台如何携带登录接口返回的sid和token接口调用鉴权streamToken视频流鉴权
Internet download manager is simply a killer of downloaders
一文了解微服务低代码实现方式
SPSS Chi-Square
[LeetCode]剑指 Offer 61. 扑克牌中的顺子
Template school jumpserver security operation and maintenance audit screen
BGP机房的优点
超全PMP备考文档汇总
C语言经典练习题(1)——“水仙花数“
Online matting and background changing and erasing tools
Is it safe to buy shares and open an account? Will you lose money?
Mathematical modeling -- graph and network models and methods (II)
视频点播中相关分辨率说明
BCG 使用之CBCGPColorDialog控件