235. 二叉搜索树的最近公共祖先

294 阅读1分钟

题目介绍

力扣235题:leetcode-cn.com/problems/lo…

image.png

分析

这题让求二叉搜索树的最近公共祖先,而二叉搜索树的特点就是:左子树的所有节点都小于当前节点,右子树的所有节点都大于当前节点,并且每棵子树都具有上述特点,所以这题就好办了,从更节点开始遍历

  • 如果两个节点值都小于根节点,说明他们都在根节点的左子树上,我们往左子树上找
  • 如果两个节点值都大于根节点,说明他们都在根节点的右子树上,我们往右子树上找
  • 如果一个节点值大于根节点,一个节点值小于根节点,说明他们他们一个在根节点的左子树上一个在根节点的右子树上,那么根节点就是他们的最近公共祖先节点。

画个图看一下,比如要找0和5的最近公共祖先节点,如下图所示

image.png

image.png

代码如下:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {

    TreeNode result = null;

    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        dfs(root , p , q);
        return result;
    }

    public void dfs(TreeNode root, TreeNode p, TreeNode q) {
        if(root.val > Math.max(p.val , q.val)) {
            //说明两个节点都在当前根节点的左子树上
            dfs(root.left , p , q);
        }else if(root.val < Math.min(p.val , q.val)) {
            //说明两个节点都在当前根节点的右子树上
            dfs(root.right , p , q);
        }else {
            //找到最近公共祖先
            result = root;
        }
    }
}