1. 题目
2. 思路
(1) 递归
- 首先列举所有情况:
- p和q的值均小于根结点的值,则p和q均在根结点的左子树中;
- p和q的值均大于根结点的值,则p和q均在根结点的右子树中;
- p和q的值一个小于根结点的值,另一个大于根结点的值,则最近公共祖先就是根结点;
- p和q的值一个等于根结点的值,另一个小于或大于根结点的值,则最近公共祖先也是根结点。
- 根据列举的情况,递归查询p和q的公共祖先即可。
(2) 迭代
3. 代码
public class Test {
public static void main(String[] args) {
}
}
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 (p.val < root.val && q.val < root.val) {
return lowestCommonAncestor(root.left, p, q);
}
if (p.val > root.val && q.val > root.val) {
return lowestCommonAncestor(root.right, p, q);
}
return root;
}
}
class Solution1 {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
while (root != null) {
if (p.val < root.val && q.val < root.val) {
root = root.left;
} else if (p.val > root.val && q.val > root.val) {
root = root.right;
} else break;
}
return root;
}
}