Question:
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。
Analysis:
问题描述:在一棵二叉搜索树中寻找两个节点的公共祖先(BST的特点是,左子树的所有节点的值小于根节点的值,右子树的所有节点的值大于根节点的值)。
1)先排除特殊情况;
2)如果根节点的值大于两个节点的最大值,则ancestor一定在左子树中,递归左子树;
3)如果根节点的值小于两个节点的最小值,则ancestor一定在右子树中,递归右子树;
4)否则,根节点与其中一个值相等或者大于左节点小于右节点,则结束递归,返回根节点。
Answer:
/** * 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; // if(p == root || q == root) //如果一个是根节点,则根节点一定是最近common ancestor // return root; if(root.val < Math.min(p.val, q.val)) //root比最小的都要小,说明在右边子树中 return lowestCommonAncestor(root.right, p, q); else if(root.val > Math.max(p.val, q.val)) //root比最大的都要大,说明在左边子树中 return lowestCommonAncestor(root.left, p, q); else return root; } }
2)非递归方法判断(效率也没有很高啊。。)
/** * 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; TreeNode t = root; while(true) { if(t.val > p.val && t.val > q.val) t = t.left; else if(t.val < p.val && t.val < q.val) t = t.right; else return t; } } }