最近公共祖先 (Lowest common ancestor)
来源:互联网 发布:sql server2012安装 编辑:程序博客网 时间:2024/04/29 16:46
问题:
给定一个二叉树,找到两个节点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); }有个covers这个函数,我们要实现前面三种不同的情况,那就简单了。代码如下:
/* * 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; }如果这个二叉树是BST,那么我们可以利用BST的特点,把根节点的值与两个节点的值进行比较,如果两个节点的值都比根节点的值小,那么一定在根节点的左边,所以我们把根节点的左子节点作为起始点,然后递归。如果两个节点的值都比祖先节点的值大,那么一定在根节点的右边,所以我们把根节点的右子节点作为起始点,然后递归,如果上面两张情况都不是,那么很明显,这个根节点就是LCA. 代码如下:
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里的情况。
参考:
http://www.leetcode.com/2011/07/lowest-common-ancestor-of-a-binary-search-tree.html
http://blog.csdn.net/beiyeqingteng
- 最近公共祖先 (Lowest common ancestor)
- 最近公共祖先 (Lowest common ancestor)
- 最近公共祖先 LCA (Lowest Common Ancestor)
- lintcode lowest-common-ancestor 最近公共祖先
- [Lintcode]Lowest Common Ancestor 最近公共祖先
- 【LeetCode】 Lowest Common Ancestor 最近公共祖先
- 88.Lowest Common Ancestor-最近公共祖先(中等题)
- 最近公共祖先LCA(Lowest Common Ancestor)
- lowest common ancestor 最低公共祖先
- 最低公共祖先 lowest common ancestor
- Range Minimum Query and Lowest Common Ancestor 区间最值查询和最近公共祖先问题
- 【二叉树】最近公共祖先Lowest Common Ancestor of a Binary Tree
- 【二叉树】最近公共祖先【235. Lowest Common Ancestor of a Binary Search Tree】
- leetcode 235. Lowest Common Ancestor of a Binary Search Tree 最近公共祖先 + BST
- 【LeetCode】Lowest Common Ancestor II 最近公共祖先 II - Easy
- 最低公共祖先Lowest Common Ancestor of a Binary Tree
- 二叉树 之 lowest common ancestor 最低公共祖先
- 二叉搜索树(BST)的最近公共祖先(LCA)问题(Lowest Common Ancestor of a Binary Tree)
- 磁带格式介绍及比较
- 2012 手机设计的10个趋势
- 报文(含8583)模拟仿真测试工具1.7版本发布
- Android底层开发之旅—蓝牙系统分析
- DB2 命令行中如何执行sql脚本
- 最近公共祖先 (Lowest common ancestor)
- CAP原理与最终一致性
- 惯性导航系统INS与GPS
- maven eclipse source
- MongoDB一些基本操作(二)
- DWR1.1 配置和使用
- 稀疏表示+子空间学习 (ICCV2011)
- 百度快照直接复制百度文库文章
- LM75温度芯片I2C驱动