如果一个节点能够在它的左右子树中分别找到p和q,则该节点为LCA节点
    在标准的最近公共祖先问题中,我们要在后序位置通过左右子树的搜索结果来判断当前节点是不是LCA:

    1. // 在二叉树中寻找 val1 和 val2 的最近公共祖先节点
    2. TreeNode find(TreeNode root, int val1, int val2) {
    3. if (root == null) {
    4. return null;
    5. }
    6. // 前序位置
    7. if (root.val == val1 || root.val == val2) {
    8. // 如果遇到目标值,直接返回
    9. return root;
    10. }
    11. TreeNode left = find(root.left, val1, val2);
    12. TreeNode right = find(root.right, val1, val2);
    13. // 后序位置,已经知道左右子树是否存在目标值
    14. if (left != null && right != null) {
    15. // 当前节点是 LCA 节点
    16. return root;
    17. }
    18. return left != null ? left : right;
    19. }

    但对于 BST 来说,根本不需要老老实实去遍历子树,由于 BST 左小右大的性质,将当前节点的值与val1和val2作对比即可判断当前节点是不是LCA
    假设val1 < val2,那么val1 <= root.val <= val2则说明当前节点就是LCA;若root.val比val1还小,则需要去值更大的右子树寻找LCA;若root.val比val2还大,则需要去值更小的左子树寻找LCA。

    1. // 在 BST 中寻找 val1 和 val2 的最近公共祖先节点
    2. TreeNode find(TreeNode root, int val1, int val2) {
    3. if (root == null) {
    4. return null;
    5. }
    6. if (root.val > val2) {
    7. // 当前节点太大,去左子树找
    8. return find(root.left, val1, val2);
    9. }
    10. if (root.val < val1) {
    11. // 当前节点太小,去右子树找
    12. return find(root.right, val1, val2);
    13. }
    14. // val1 <= root.val <= val2
    15. // 则当前节点就是最近公共祖先
    16. return root;
    17. }