235. Lowest Common Ancestor of a Binary Search Tree
2016-02-24 20:57
731 查看
题目:
Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST.
According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined
between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”
For example, the lowest common ancestor (LCA) of nodes
Another example is LCA of nodes
since a node can be a descendant of itself according to the LCA definition.
思路:
首先注意到题目中的树是平衡二叉树,它的特点就是,根节点的值大于其左子树中的所有值,且小于其右子树中的所有值。
根据平衡二叉树的特点并且举例不难发现,从根开始进行递归,不妨设p的值小于q,那么找到大于p且小于q的节点即可,特殊的情况就是p是q的根或者q是p的根。
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
//处理为空的情况
if(root == null || p == null || q == null){
return null;
}
//比较两个节点值的大小,small为值较小的结点
TreeNode small, big;
if(p.val == q.val){
return p;
}else if(p.val < q.val){
small = p;
big = q;
}else{
small = q;
big = p;
}
//递归实现代码
if(root.val >= small.val && root.val <= big.val){
return root;
}else if(root.val < small.val){
return lowestCommonAncestor(root.right, small, big);
}else{
return lowestCommonAncestor(root.left, small, big);
}
}
}
【注】
在完成本题之后第一次关注了程序运行的时间和占用的空间,发现自己的程序挺慢的,discuss里的代码思路和我相似,但是代码比我的更简练。
Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST.
According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined
between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”
_______6______ / \ ___2__ ___8__ / \ / \ 0 _4 7 9 / \ 3 5
For example, the lowest common ancestor (LCA) of nodes
2and
8is
6.
Another example is LCA of nodes
2and
4is
2,
since a node can be a descendant of itself according to the LCA definition.
思路:
首先注意到题目中的树是平衡二叉树,它的特点就是,根节点的值大于其左子树中的所有值,且小于其右子树中的所有值。
根据平衡二叉树的特点并且举例不难发现,从根开始进行递归,不妨设p的值小于q,那么找到大于p且小于q的节点即可,特殊的情况就是p是q的根或者q是p的根。
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
//处理为空的情况
if(root == null || p == null || q == null){
return null;
}
//比较两个节点值的大小,small为值较小的结点
TreeNode small, big;
if(p.val == q.val){
return p;
}else if(p.val < q.val){
small = p;
big = q;
}else{
small = q;
big = p;
}
//递归实现代码
if(root.val >= small.val && root.val <= big.val){
return root;
}else if(root.val < small.val){
return lowestCommonAncestor(root.right, small, big);
}else{
return lowestCommonAncestor(root.left, small, big);
}
}
}
【注】
在完成本题之后第一次关注了程序运行的时间和占用的空间,发现自己的程序挺慢的,discuss里的代码思路和我相似,但是代码比我的更简练。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树