📅  最后修改于: 2023-12-03 15:10:02.672000             🧑  作者: Mango
有时候在对二叉树进行操作的时候,我们会需要找到距离给定节点一定距离的节点。这里我们介绍一种常用方法,可以实现打印距离给定节点距离为 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 等相关算法。