📅  最后修改于: 2023-12-03 15:40:00.878000             🧑  作者: Mango
本问题涉及到二叉搜索树中查找两个节点的最近公共祖先。二叉搜索树是一种特殊的二叉树,它满足如下性质:
在二叉搜索树中查找两个节点的最近公共祖先可以采用递归或迭代的方法实现。
给定一棵二叉搜索树和两个节点p和q,查找它们的最近公共祖先节点(LCA)。假设输入的两个节点都存在于二叉搜索树中,并且每个节点的值都不同。
递归算法是一种自顶向下的算法,其核心思想是判断当前节点是否为最近公共祖先,如果不是则递归寻找左右子树中是否存在p和q节点。如果一个节点的左右子树中分别存在p和q节点,那么该节点就是它们的最近公共祖先。
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
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
迭代算法是一种自底向上的算法,其核心思想是利用二叉搜索树的性质,在树的深度优先搜索过程中寻找两个节点的路径,并最终找到它们的最近公共祖先。
class Solution:
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
stack = [root]
parent = {root: None}
while p not in parent or q not in parent:
node = stack.pop()
if node.left:
parent[node.left] = node
stack.append(node.left)
if node.right:
parent[node.right] = node
stack.append(node.right)
ancestors = set()
while p:
ancestors.add(p)
p = parent[p]
while q not in ancestors:
q = parent[q]
return q
本问题的算法实现方法有两种,递归算法和迭代算法。它们的时间复杂度均为O(h),其中h是树的高度。需要注意的是,本问题假设输入的两个节点都存在于二叉搜索树中,并且每个节点的值都不同。如果不满足这些条件,需要对算法进行相应的修改。