返回
LeetCode 0235:二叉搜索树的最近公共祖先【Python】
见解分享
2023-10-08 12:53:52
引言
在计算机科学中,二叉搜索树 (BST) 是广泛应用的数据结构。BST 的特殊性质使得在其中查找、插入和删除元素都非常高效。在 BST 中,一个节点的左子树包含所有小于该节点的值,而右子树包含所有大于该节点的值。
题目概述
给定一个二叉搜索树和其中两个节点,我们的目标是找到这两个节点的最近公共祖先 (LCA)。LCA 是两个节点共有的最近祖先。
Python 解法
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
if not root:
return None
if root.val > p.val and root.val > q.val:
return self.lowestCommonAncestor(root.left, p, q)
elif root.val < p.val and root.val < q.val:
return self.lowestCommonAncestor(root.right, p, q)
else:
return root
算法详解
-
递归终止条件: 当根节点为空时,直接返回 None。
-
判断左右子树: 比较根节点的值与 p 和 q 的值。如果根节点的值大于 p 和 q 的值,则 LCA 在左子树中;如果根节点的值小于 p 和 q 的值,则 LCA 在右子树中;如果根节点的值介于 p 和 q 之间,则根节点就是 LCA。
-
递归调用: 根据判断结果,分别递归调用左子树或右子树,直到找到 LCA。
复杂度分析
- 时间复杂度:O(log n),其中 n 是树中的节点数。因为 BST 的性质,每次递归调用都会将搜索空间减少一半。
- 空间复杂度:O(log n),递归调用栈的空间占用。
示例
6
/ \
2 8
/ \
0 4
/ \
3 5
给定 p = 2 和 q = 4,LCA 是 2。
练习题
- 实现一个函数,给定一个二叉树,返回树的深度。
- 实现一个函数,给定一个二叉树,判断该树是否为平衡树。