📅  最后修改于: 2023-12-03 15:06:19.928000             🧑  作者: Mango
在二叉树中,给定两个节点p和q,找到它们的最低共同祖先(LCA)。
假设我们有如下一个二叉树:
3
/
5 1
/ \ /
6 2 0 8
/
7 4
示例1:
输入:p = 5, q = 1 输出:3 解释:节点 5 和节点 1 的最低共同祖先是节点 3。
示例2:
输入:p = 5, q = 4 输出:5 解释:节点 5 和节点 4 的最低共同祖先是节点 5,因为节点 5 是节点 5 和节点 4 的共同父节点,并且它是LCA。
本篇文章主要介绍使用父指针的方式来解决上述问题。
我们从树的根节点开始,使用一个hashmap记录每个节点的父节点以及每个节点是否被访问过。接下来,我们分别从p和q节点开始,向它们的父节点移动,直到找到共同的节点。如果一个节点已经被访问过了,那么说明它就是LCA。
我们从根节点开始,用哈希表记录每个节点的父节点。
我们从p节点开始,将它的所有祖先节点标记为已经访问过。
接着,我们再从q节点开始向上遍历它的祖先节点,遇到第一个已经访问过的节点,那么这个节点就是p节点和q节点的最低公共祖先,返回即可。
class Solution:
def lowestCommonAncestor(self, p: 'Node', q: 'Node') -> 'Node':
# 定义hash表和遍历标记visited
parent_dict = dict()
visited = set()
# 从根节点开始遍历,将每个节点的父节点记录在hash表中
def dfs(node):
if node:
if node.left:
parent_dict[node.left] = node
dfs(node.left)
if node.right:
parent_dict[node.right] = node
dfs(node.right)
# p节点及其祖先节点做标记,直至根节点
while p:
visited.add(p)
p = parent_dict.get(p)
# q节点及其祖先节点在hash表中查找是否有已经被访问过的节点,第一个就是LCA
while q:
# 如果q节点已经被访问过,那么这个节点就是LCA
if q in visited:
return q
q = parent_dict.get(q)
return None
以上就是使用父指针的方法来解决二叉树中查找最低共同祖先的问题的全部过程。这种方法的时间复杂度为O(n),如果树是一个平衡二叉树的话,空间复杂度为O(logn)。