📟作者主页:慢热的陕西人
🌴专栏链接:力扣刷题日记
📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言
牛客热题:在二叉树中找到两个最近公共祖先
题目链接
在二叉树中找到两个节点的最近公共祖先_牛客题霸_牛客网 (nowcoder.com)
方法一:递归
思路
- 如果当前节点为
nullptr
或当前节点的值等于o1
或o2
,则返回当前节点。 - 递归地在左子树中查找
o1
和o2
。 - 递归地在右子树中查找
o1
和o2
。 - 如果左子树或右子树中只有一个找到了
o1
或o2
,则返回找到的那个子树。 - 如果左子树和右子树都找到了
o1
或o2
,则返回当前节点作为LCA。
代码
TreeNode* _lowest(TreeNode* root, int o1, int o2)
{
if(root == nullptr || root->val == o1 || root->val == o2)
return root;
//去左子树找
TreeNode* left = _lowest(root->left, o1, o2);
//去右子树找
TreeNode* right = _lowest(root->right, o1, o2);
if(!left) return right;
if(!right) return left;
return root;
}
int lowestCommonAncestor(TreeNode* root, int o1, int o2)
{
return _lowest(root, o1, o2)->val;
}
复杂度
时间复杂度
由于这是一个递归函数,其时间复杂度与树的高度相关。在最坏的情况下(树完全不平衡),时间复杂度为O(n),其中n是树中的节点数。在最好的情况下(树完全平衡),时间复杂度接近O(log n)。
空间复杂度
空间复杂度由递归栈的深度决定。在最坏的情况下(树完全不平衡),空间复杂度为O(n)。在最好的情况下(树完全平衡),空间复杂度接近O(log n)。但是,需要注意的是,这里的空间复杂度不包括存储结果或中间结果的额外空间,只考虑了递归栈的空间。