📌  相关文章
📜  打印树的任意两个节点之间的路径。 DFS(1)

📅  最后修改于: 2023-12-03 15:39:41.858000             🧑  作者: Mango

打印树的任意两个节点之间的路径,DFS

问题描述

给定一棵树和任意两个节点,打印出这两个节点之间的路径。

解决方案

我们可以使用深度优先搜索(DFS)来解决这个问题。具体步骤如下:

  1. 从根节点开始进行DFS搜索,找到目标节点1和目标节点2。

  2. 在搜索的过程中,用一个数组记录每个节点的父节点。这个数组存储了从根节点到每个节点的路径。可以使用哈希表等数据结构来实现。

  3. 找到目标节点1和目标节点2后,可以利用这个父节点的数组,从目标节点1和目标节点2分别向上遍历到根节点,记录经过的节点。

  4. 对于记录下来的两个路径,从根节点开始向下遍历,直到两个路径不同为止。这个点就是目标节点1和目标节点2的最近公共祖先。

  5. 最后,把目标节点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解决这个问题的方法,其中最难点是如何计算最近公共祖先。通过这个问题的解决,我们可以加深对树这个数据结构的理解,同时也可以提高手写递归代码的能力。