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

题目描述

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

解题思路

首先明确二叉搜索树的概念

  • 根节点的值大于等于左孩子节点的值
  • 根节点的值小于等于右孩子节点的值
  • 根节点的左子树和右子树也是二叉搜索树

假设两个指定节点分别为p、q,且p < q,由上可得,对于二叉搜索树的一个节点t,会有如下三种情况:

  • 若p < root 且 q < root,则两个节点的最近公共祖先在root的左子树中。
  • 若p > root 且 q > root,则两个节点的最近公共祖先在root的右子树中。
  • 若p <= root且 q >= root,则两个节点的最近公共祖先为root。

Code

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        //交换p、q值
        if(p.val > q.val){
            return lowestCommonAncestor(root,q,p);
        }
        if(p.val <= root.val && q.val >= root.val){
            return root;
        }
        TreeNode ans = new TreeNode();
        if(p.val < root.val && q.val < root.val){
            ans = lowestCommonAncestor(root.left,p,q);
        }else if(p.val > root.val && q.val > root.val){
            ans = lowestCommonAncestor(root.right,p,q);
        }
        return ans;
    }
}

results matching ""

    No results matching ""