题目地址(863. 二叉树中所有距离为 K 的结点)
https://leetcode.cn/problems/all-nodes-distance-k-in-binary-tree/
题目描述
给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 k 。
返回到目标结点 target 距离为 k 的所有结点的值的列表。 答案可以以 任何顺序 返回。
示例 1:
输入:root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, k = 2
输出:[7,4,1]
解释:所求结点为与目标结点(值为 5)距离为 2 的结点,值分别为 7,4,以及 1
示例 2:
输入: root = [1], target = 1, k = 3
输出: []
提示:
节点数在 [1, 500] 范围内
0 <= Node.val <= 500
Node.val 中所有值 不同
目标结点 target 是树上的结点。
0 <= k <= 1000
前置知识
公司
- 暂无
思路
关键点
代码
- 语言支持:Python3
Python3 Code:
# 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]:
# 返回到目标结点target距离为k的所有结点的值的列表
# 首先,咱们知道树是一种特殊的图(单向的,只能从子结点开始遍历),但是由于该题需要计算距离(可以从父节点遍历),因此可以先让树变成有向图,然后遍历图
# 由于该题的结点值各不相同,因此可以采用哈希表来存储父结点信息
node_parent = dict() # key为子节点 value为父节点
def dfs_find_parent(node):
if node:
if node.left:
node_parent[node.left] = node
if node.right:
node_parent[node.right] = node
dfs_find_parent(node.left)
dfs_find_parent(node.right)
dfs_find_parent(root)
# 边界条件判断
if k == 0:
return [target.val]
res = []
Q = collections.deque()
visited = set()
Q.append(target)
visited.add(target)
level = 0
while Q and level<k:
level += 1
for _ in range(len(Q)):
x = Q.popleft()
# 遍历三个方向 父节点 左子树 右子树
for y in [node_parent[x] if x in node_parent else None, x.left, x.right]:
if y and y not in visited:
if level == k:
res.append(y.val)
Q.append(y)
visited.add(y)
return res
Python3 Code:
# 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]:
# 返回到目标结点target距离为k的所有结点的值的列表
# 首先,咱们知道树是一种特殊的图(单向的,只能从子结点开始遍历),但是由于该题需要计算距离(可以从父节点遍历),因此可以先让树变成有向图,然后遍历图
# 由于该题的结点值各不相同,因此可以采用哈希表来存储父结点信息
node_parent = dict() # key为子节点 value为父节点
def dfs_find_parent(node):
if node:
if node.left:
node_parent[node.left] = node
if node.right:
node_parent[node.right] = node
dfs_find_parent(node.left)
dfs_find_parent(node.right)
dfs_find_parent(root)
# 采用DFS
def dfs_find_res(node,prev,cur_dist):
if node:
if cur_dist == k:
res.append(node.val)
return
if node.left != prev:
dfs_find_res(node.left,node,cur_dist+1)
if node.right != prev:
dfs_find_res(node.right,node,cur_dist+1)
if node in node_parent and node_parent[node] != prev:
dfs_find_res(node_parent[node],node,cur_dist+1)
res = []
dfs_find_res(target,None,0)
return res
复杂度分析
令 n 为数组长度。
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)