题目
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
思路
主要就是根据二叉搜索树的性质:根节点的值总是大于他的左子树中的所有值,总是小于右子树的所有值。
代码
递归:
/**
* 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) {
//如果小于等于0,说明p和q位于root的两侧,直接返回即可
if ((root.val - p.val) * (root.val - q.val) <= 0)
return root;
//否则,p和q位于root的同一侧,就继续往下找 //p和q在同一侧,p的值比当前结点的值小,则p和q都在当前结点的左侧,在当前结点的左子树中查找就可以了。否则就在右子树。
return lowestCommonAncestor(p.val < root.val ? root.left : root.right, p, q);
}
}
迭代
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
while((p.val - root.val)*(q.val - root.val) > 0){ //一直在同一侧满足条件
if (p.val - root.val < 0) root = root.left; //在左边,则继续查找当前结点的左子树。
else root = root.right; //在右边
}
return root;
}
}