返回
二叉树中最近公共祖先的详解
见解分享
2024-02-14 17:55:44
什么是二叉树的最近公共祖先?
在二叉树中,两个节点的最近公共祖先(Lowest Common Ancestor,简称 LCA)是指这两个节点在树中的最近祖先节点。
如何找到二叉树中两个节点的最近公共祖先?
深度优先搜索(DFS)算法
DFS算法是一种遍历二叉树的算法,它从根节点开始,沿着一条路径向下遍历,直到找到目标节点。如果目标节点位于当前路径上,则返回该节点。否则,回溯到父节点,继续沿着另一条路径向下遍历,直到找到目标节点。
广度优先搜索(BFS)算法
BFS算法也是一种遍历二叉树的算法,它从根节点开始,将所有与根节点相邻的节点放入队列。然后,将队列中的第一个节点出队,并将其相邻的节点放入队列。以此类推,直到找到目标节点。
DFS算法的实现
def find_lca(root, p, q):
if not root:
return None
# 如果当前节点就是p或q,则返回当前节点
if root.val == p.val or root.val == q.val:
return root
# 递归查找左子树
left_lca = find_lca(root.left, p, q)
# 递归查找右子树
right_lca = find_lca(root.right, p, q)
# 如果左子树和右子树都找到了p和q,则当前节点就是最近公共祖先
if left_lca and right_lca:
return root
# 如果只有左子树找到了p或q,则左子树的最近公共祖先就是最近公共祖先
if left_lca:
return left_lca
# 如果只有右子树找到了p或q,则右子树的最近公共祖先就是最近公共祖先
if right_lca:
return right_lca
# 如果左子树和右子树都没有找到p或q,则当前节点不是最近公共祖先
return None
BFS算法的实现
def find_lca(root, p, q):
if not root:
return None
# 创建队列,并把根节点入队
queue = [root]
# 创建一个字典,用于存储每个节点的父节点
parent = {root: None}
# 循环队列,直到找到p和q
while queue:
# 出队一个节点
node = queue.pop(0)
# 如果当前节点就是p或q,则返回当前节点
if node.val == p.val or node.val == q.val:
return node
# 如果当前节点有左子树,则把左子树入队,并把当前节点作为左子树的父节点
if node.left:
queue.append(node.left)
parent[node.left] = node
# 如果当前节点有右子树,则把右子树入队,并把当前节点作为右子树的父节点
if node.right:
queue.append(node.right)
parent[node.right] = node
# 如果没有找到p和q,则返回None
return None
算法的复杂度分析
DFS算法和BFS算法的复杂度都是O(n),其中n是二叉树的节点数。
结语
二叉树的最近公共祖先算法是二叉树中一个重要的算法,它可以用于解决许多问题,例如查找两个节点之间的最短路径、计算二叉树的高度等。希望本文对您理解二叉树的最近公共祖先算法有所帮助。