📅  最后修改于: 2023-12-03 15:39:41.858000             🧑  作者: Mango
给定一棵树和任意两个节点,打印出这两个节点之间的路径。
我们可以使用深度优先搜索(DFS)来解决这个问题。具体步骤如下:
从根节点开始进行DFS搜索,找到目标节点1和目标节点2。
在搜索的过程中,用一个数组记录每个节点的父节点。这个数组存储了从根节点到每个节点的路径。可以使用哈希表等数据结构来实现。
找到目标节点1和目标节点2后,可以利用这个父节点的数组,从目标节点1和目标节点2分别向上遍历到根节点,记录经过的节点。
对于记录下来的两个路径,从根节点开始向下遍历,直到两个路径不同为止。这个点就是目标节点1和目标节点2的最近公共祖先。
最后,把目标节点1到最近公共祖先的路径和目标节点2到最近公共祖先的路径连接起来,就是目标节点1和目标节点2之间的路径。
以下是Python实现:
def dfs(root, target, parent):
if not root:
return
if root.val == target:
return root
parent[root.left] = root
dfs(root.left, target, parent)
parent[root.right] = root
dfs(root.right, target, parent)
def lowestCommonAncestor(root, p, q):
parent = {}
dfs(root, p, parent)
dfs(root, q, parent)
p_path, q_path = set(), set()
while p:
p_path.add(p)
p = parent[p]
while q:
q_path.add(q)
q = parent[q]
lca = p_path.intersection(q_path)
for node in lca:
return node
def findPath(root, target):
path = []
while root:
path.append(root)
root = parent.get(root)
return path[::-1]
def printPath(root, p, q):
parent = {}
lca = lowestCommonAncestor(root, p, q)
p_path = findPath(lca, p)
q_path = findPath(lca, q)
path = p_path + q_path[1:]
print("->".join([str(node.val) for node in path]))
其中,dfs函数用于遍历树,找到目标节点,并记录经过的节点的父节点;lowestCommonAncestor函数用于计算目标节点1和目标节点2的最近公共祖先;findPath函数用于根据父节点数组,计算从根节点到目标节点的路径;printPath函数是这个算法的入口,用于计算并打印目标节点1和目标节点2之间的路径。
打印树的任意两个节点之间的路径,是一个比较基础的树操作。本文介绍了一种使用DFS解决这个问题的方法,其中最难点是如何计算最近公共祖先。通过这个问题的解决,我们可以加深对树这个数据结构的理解,同时也可以提高手写递归代码的能力。