📟作者主页:慢热的陕西人
🌴专栏链接:力扣刷题日记
📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言
牛客热题:二叉搜索树的最近公共祖先
题目链接
二叉搜索树的最近公共祖先_牛客题霸_牛客网 (nowcoder.com)
方法一:递归
思路
- 如果当前节点的值介于 p 和 q 之间(包括等于),那么当前节点就是最低公共祖先节点,直接返回当前节点的值。
- 如果当前节点的值比 p 和 q 都大,说明 p 和 q 都在当前节点的左子树中,因此向左子树递归查找。
- 如果当前节点的值比 p 和 q 都小,说明 p 和 q 都在当前节点的右子树中,因此向右子树递归查找。
- 如果以上情况都不满足,则说明最低公共祖先节点在当前节点的左右子树中,或者根本不存在这样的节点,返回 -1。
代码
int lowestCommonAncestor(TreeNode* root, int p, int q)
{
if(root->val <= p && root->val >= q) return root->val;
if(root->val >= p && root->val <= q) return root->val;
if(root->val < p && root->val < q) return lowestCommonAncestor(root->right, p, q);
else if(root->val > p && root->val > q) return lowestCommonAncestor(root->left, p, q);
return -1;
}
复杂度
时间复杂度:这段代码的时间复杂度取决于树的高度,即 O(h),其中 h 是树的高度。在最坏情况下,树可能不平衡,高度为 n,因此最坏情况下的时间复杂度为 O(n)
空间复杂度:主要取决于递归调用的深度,即函数调用栈的使用情况。在最坏情况下,如果二叉搜索树是一个不平衡的树,递归调用可能达到树的高度。因此,空间复杂度为 O(h),其中 h 是树的高度