一、题目描述:
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)
- 定义
-
- 节点的左子树包含的节点的值小于该节点的值
-
- 节点的右子树包含的节点的值大于等于该节点的值
-
- 节点的左子树和右子树都是BST
-
- 查找在平均和最坏的情况下都是lgN级别,接近二分查找
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情