📌  相关文章
📜  打印距给定节点距离为 k 的所有节点(1)

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

打印距给定节点距离为 k 的所有节点

有时候在对二叉树进行操作的时候,我们会需要找到距离给定节点一定距离的节点。这里我们介绍一种常用方法,可以实现打印距离给定节点距离为 k 的所有节点的功能。

实现思路

我们可以先使用 DFS 遍历树,得到每个节点的父节点。然后我们以给定节点为根节点,向下遍历距离为 k 的所有节点,并在遍历过程中标记已访问的节点。最后以得到的结果即为我们要求的距离给定节点距离为 k 的所有节点。

代码实现

下面是一个用 Python 实现的例子:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def distanceK(self, root, target, K):
        """
        :type root: TreeNode
        :type target: TreeNode
        :type K: int
        :rtype: List[int]
        """
        # 先遍历一遍树,得到所有节点的父节点
        parent_map = {}
        self.get_parent_map(root, None, parent_map)

        # BFS 遍历距离为 K 的所有节点
        visited = set()
        queue = [target]
        depth = 0
        while queue:
            size = len(queue)
            if depth == K:
                return [node.val for node in queue]
            for i in range(size):
                node = queue.pop(0)
                visited.add(node)
                for nei in [node.left, node.right, parent_map.get(node)]:
                    if nei and nei not in visited:
                        queue.append(nei)
            depth += 1

        # 如果没有找到距离为 K 的节点,返回空列表
        return []
        
    def get_parent_map(self, node, parent, parent_map):
        if not node:
            return
        parent_map[node] = parent
        self.get_parent_map(node.left, node, parent_map)
        self.get_parent_map(node.right, node, parent_map)

在上面的例子中,我们先使用 get_parent_map 方法遍历一遍树,得到每个节点的父节点并保存在 parent_map 字典中。在 distanceK 方法中,我们以给定节点 target 为中心,使用 BFS 遍历距离为 K 的所有节点,并在遍历过程中标记已访问的节点。

总结

通过对题目需求的分析,我们可以使用 DFS 遍历树,并以 BFS 遍历距离为 K 的节点来实现打印距离给定节点距离为 K 的所有节点的功能。通过理解这个方法,我们可以更深入的理解树的遍历、BFS、DFS 等相关算法。