题目:
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.
然后又给了一个例子,关于这个最近的公共祖先的求法。
那么具体我们在操作的时候该如何来实现呢?首先看这个题目中的函数模板,它给了一个是
public class Solution
{
public TreeNode lowestCommonAncestor(TreeNode root,TreeNode p,TreeNode q)
//一开始LZ不理解这里的参数,后来发现第一个参数表示的是整棵树的根节点,而接下来的两个节点表示的是需要查找的两个节点。
{
}
}
那么针对这道题,仔细一想,其实可以考虑分三种情况:
1.如果p和q的值位于root的两侧,那么不管如何,root一定是他们最小的那个公共的祖先。(当然这里要考虑一种情况就是如果p是根节点,而q是它的某一个字树节点,那么无论如何,这个p就是最小的公共祖先)。
2.如果p和q的值都位于root的左边,那么考虑继续使用递归,此时将root的设为原来的左子树。
3.如果p和q的值都位于root的右边,那么考虑继续使用递归,此时将root的设为原来的右子树。
就是不停地使用递归方法。
具体的代码如下:
public static TreeNode lowestCommonAncestor(TreeNode root,TreeNode p,TreeNode q)
{
//if((p.val <= root.val && q.val >= root.val) || (q.val <= root.val && p.val >= root.val))
//return root;
if(root == null || p == null || q == null)
return null;
else
{
if(p.val < root.val && q.val < root.val)
return lowestCommonAncestor(root.left,p,q);
else if(p.val > root.val && q.val > root.val)
return lowestCommonAncestor(root.right,p,q);
else
return root;
}
}