863. 二叉树中所有距离为 K 的结点
原始题目链接:https://leetcode-cn.com/problems/all-nodes-distance-k-in-binary-tree/
给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K 。
返回到目标结点 target 距离为 K 的所有结点的值的列表。 答案可以以任何顺序返回。
提示:
给定的树是非空的。
树上的每个结点都具有唯一的值 0 <= node.val <= 500 。
目标结点 target 是树上的结点。
0 <= K <= 1000.
解题思路:
1、给每个节点增加一个指向其父节点的引用,可以用深度优先遍历DFS递归实现。
2、从目标节点出发,题目要求距离为K,则for循环遍历K次,用两个列表分别存储当前层的节点和已经遍历过的节点,可以用层序遍历BFS实现。注意:已经遍历过的节点列表用于去重,如果不进行判断的话会来回往复查询。具体实现看代码。
代码实现:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def distanceK(self, root: TreeNode, target: TreeNode, K: int) -> List[int]:
# 为树中的所有节点增加一个指向父节点的引用
def add_parent(root, parent=None):
if root:
root.par = parent
add_parent(root.left, root)
add_parent(root.right, root)
add_parent(root)
# 因为要找距离为K的所有节点,从目标节点开始查找距离为K的所有节点
# for循环遍历的上界定为K
# 从target节点所在的层开始算起,当前层的节点列表
# 初始化为target节点
cur_node_list = [target]
# 已遍历到的节点列表,也从target节点开始算起
seen_node_list = [target]
for _ in range(K):
# 遍历的当前层节点的同时,记录当前层节点的左、右、父节点
cur_node_new = []
for node in cur_node_list:
# 遍历当前层节点的左、右、父节点
for n in (node.left, node.right, node.par):
# 是否出现在已经遍历的节点列表中,避免重复查询
if n and n not in seen_node_list:
seen_node_list.append(n)
cur_node_new.append(n)
# 最外层for循环自增表示进入到了下一层
# 所以要更新下一次遍历的当前层的节点
cur_node_list = cur_node_new
# 返回答案,for循环结束,cur_node_list已经包含了距离为K的所有节点
return [node.val for node in cur_node_list]
参考文献:
https://leetcode-cn.com/problems/all-nodes-distance-k-in-binary-tree/solution/pythonbfsjie-dian-ke-zhi-jie-gou-jian-fu-jie-dian-/
https://leetcode-cn.com/problems/all-nodes-distance-k-in-binary-tree/solution/er-cha-shu-zhong-suo-you-ju-chi-wei-k-de-jie-dian-/