您的位置:首页 > 编程语言 > Java开发

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).”
_______6______
/              \
___2__          ___8__
/      \        /      \
0      _4       7       9
/  \
3   5


For example, the lowest common ancestor (LCA) of nodes 
2
 and 
8
 is 
6
.
Another example is LCA of nodes 
2
 and 
4
 is 
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里的代码思路和我相似,但是代码比我的更简练。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode java 递归