解题思路:
1.非递归解法:因为是搜索二叉树,所以当前节点比左子树所有节点值大,比右边小
1)比较当前节点root.val与p.val,q.val的大小
如果root.val<p.val && root.val<q.val,说明p,q在root的右子树上
如果root.val>p.val && root.val>q.val,说明p,q在root的左子树上
如果root.val>p.val && root.val<q.val,说明p,q的最近公共祖先为root
如果root.val=p.val,说明root为根节点
如果root.val=q.val,说明root为根节点
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
while((root.val-p.val)*(root.val-q.val)>0){
root=root.val-p.val>0?root.left:root.right;
}
return root;
}
}
2.递归解法
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if((root.val-p.val)*(root.val-q.val)<=0){
return root;
}
return lowestCommonAncestor(root=(root.val>p.val)?root.left:root.right,p,q);
}
}