[LeetCode]Lowest Common Ancestor of a Binary Search Tree
有个covers这个函数,我们要实现前面三种不同的情况,那就简单了。代码如下: 如果这个二叉树是BST,那么我们可以利用BST的特点,把根节点的值与两个节点的值进行比较,如果两个节点的值都比根节点的值小,那么一定在根节点的左边,所以我们把根节点的左子节点作为起始点,然后递归。如果两个节点的值都比祖先节点的值大,那么一定在根节点的右边,所以我们把根节点的右子节点作为起始点,然后递归,如果上面两张情况都不是,那么很明显,这个根节点就是LCA. 代码如下:
发布日期:2021-11-22 02:48:44
浏览次数:2
分类:技术文章
本文共 1613 字,大约阅读时间需要 5 分钟。
问题:
给定一个二叉树,找到两个节点NA, NB的最近公共祖先(LCA)。
比如对于下图,4 和 7 的 LCA 是6, 1和13的LCA 是 8。
分析:
我们这里先考虑一般的二叉树(BT),然后再考虑这个二叉树是二叉搜索树(BST)的情况。
查找两个node的最早的公共祖先,分三种情况:
1. 如果两个node在root的两边,那么最早的公共祖先就是root。
2. 如果两个node在root的左边,那么把root.leftChild作为root,再递归。
3. 如果两个node在root的右边,那么把root.rightChild作为root,再递归。
那么我们如何知道能否通过原始节点到达某一个节点呢?这里我们需要定义一个递归函数covers (Node root, Node node),让root的左右子节点不断的调用这个函数,如果某一个子节点就是要找到的节点,那么返回true,否则返回false. 具体代码如下:
- /*
- * check whether the node n is in the tree
- */
- private static boolean covers(Node rootNode, Node n) {
- if(rootNode == null) return false;
- if(rootNode == n) return true;
- return covers(rootNode.leftChild, n) || covers(rootNode.rightChild, n);
- }
- /*
- * get the first common ancestor of node p and node q
- */
- public static Node commonAncestor(Node rootNode, Node p, Node q) {
- // case 2
- if (covers(rootNode.leftChild, p) && covers(rootNode.leftChild, q))
- return commonAncestor(rootNode.leftChild, p, q);
- //case 3
- if (covers(rootNode.rightChild, p) && covers(rootNode.rightChild, q))
- return commonAncestor(rootNode.rightChild, p, q);
- //case 1
- return rootNode;
- }
- public Node LCA(Node root, Node p, Node q) {
- if (root == null || p == null || q == null ) return NULL;
- if (max(p.data, q.data) < root.data)
- return LCA(root.left, p, q);
- else if (min(p.data, q.data) > root.data)
- return LCA(root.right, p, q);
- else
- return root;
- }
备注:这里并没有考虑 p 和 q 不在 BST里的情况。
参考:
转载地址:https://blog.csdn.net/zxdfc/article/details/48030265 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2024年04月21日 19时18分38秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Linux下创建用户,分组,配置jdk, tomcat
2019-04-27
HikariCP、MySQL Configuration 性能优化
2019-04-27
系统配置自动装载机制 - 分布式开发
2019-04-27
SpringCloud实战 - Hystrix
2019-04-27
Kafka实战(七) - 优雅地部署 Kafka 集群
2019-04-27
Java支付系统(三) - SpringBoot 应用程序搭建
2019-04-27
详解Java业务领域分层模型中的vo/po/dto/pojo/bo
2019-04-27
Java持久层框架MyBatis全注解详解
2019-04-27
Java线程组ThreadGroup
2019-04-27
Java同步器之AbstractOwnableSynchronizer详解
2019-04-27
为什么需要学习并发编程?
2019-04-27
Java计算机IT编程文档常见单词翻译
2019-04-27
Java协作中断机制
2019-04-27
MySQL8.0数据库基础教程(二)-理解"关系"
2019-04-27
2020年最新阿里Java面试题,看看你都会了吗?
2019-04-27
大厂业务开发面试必问的UML你都会了吗?
2019-04-27
MySQL8.0关系数据库基础教程(三)-select语句详解
2019-04-27