leetcode 235. Lowest Common Ancestor of a Binary Search Tree【递归、BST】【easy】

170 阅读2分钟

一、题目描述:

235. Lowest Common Ancestor of a Binary Search Tree: 给定一个二叉搜索树(BST),在BST中找到两个给定节点的最低共同祖先(LCA)。 根据Wikipedia上LCA的定义:“在两个节点p和q之间的最低共同祖先被定义为T中的最低节点,其中p和q都是子节点(我们允许一个节点是其自身的子节点)。”

二、思路分析:

1.类别

递归、BST(二叉搜索树)

2.做题思路

递归的边界条件:

  • root==NULL: 叶节点
  • p->val==root->val||q->val==root->val):p是q的root或者q是p的root,注意结点的祖先可以是它本身
  • p->val<=root->val && q->val>root->val :p在root左侧,q在root右侧
  • q->val<=root->val && p->val>root->val :q在root左侧,p在root右侧

递归的情况:

  • root->val>max(p->val,q->val): p、q同在root左侧:执行lowestCommonAncestor(root->left,p,q);向左下走,递归调用。
  • root->val<min(p->val,q->val): p、q同在root右侧(也就是最后一种情况,直接用else即可):执行lowestCommonAncestor(root->right,p,q);向左下走,递归调用。

这个题主要就是要注意情况的讨论,结合BST的性质就比较简单。

三、AC 代码:

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root==NULL) return NULL;
        else if(p->val==root->val||q->val==root->val)
            return root;
        else if(p->val<=root->val && q->val>root->val)
            return root;
        else if(q->val<=root->val && p->val>root->val)
            return root;
        else if(root->val>max(p->val,q->val))
            return lowestCommonAncestor(root->left,p,q);
        else return lowestCommonAncestor(root->right,p,q);
    }
};

四、总结:

BST(Binary Search Tree)

  • 定义
      1. 节点的左子树包含的节点的值小于该节点的值
      1. 节点的右子树包含的节点的值大于等于该节点的值
      1. 节点的左子树和右子树都是BST
  • 查找在平均和最坏的情况下都是lgN级别,接近二分查找

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情