题目:
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里的代码思路和我相似,但是代码比我的更简练。