【Leetcode】863.二叉树中所有距离为 K 的结点
给定一个二叉树(具有根结点 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 <= 500Node.val中所有值 不同- 目标结点
target是树上的结点。 0 <= k <= 1000
思想:首先dfs遍历一遍二叉树,使用一个map保存二叉树所有非根节点的父节点
第二次dfs遍历二叉树,为了防止重复访问,使用visited的map保存访问情况,每次dfs一个节点父节点、左右子节点距k的距离(注意,每次k的值都-1)。
代码:
func distanceK(root *TreeNode, target *TreeNode, k int) []int {
var res []int
parents := make(map[int]*TreeNode)
var dfs func(root *TreeNode,parent *TreeNode)
dfs = func(root *TreeNode, parent *TreeNode) {
if root!=nil{
if parent!=nil{
parents[root.Val] = parent
}
dfs(root.Left,root)
dfs(root.Right,root)
}
}
dfs(root,nil)
visited:=make(map[int]bool)
var dfs1 func(root *TreeNode,k int)
dfs1 = func(root *TreeNode,k int) {
if root==nil||visited[root.Val]{
return
}
if k == 0{
res = append(res,root.Val)
}
if k > 0{
visited[root.Val]=true
if parents[root.Val]!=nil{
dfs1(parents[root.Val],k-1)
}
if root.Left!=nil{
dfs1(root.Left,k-1)
}
if root.Right!=nil{
dfs1(root.Right,k-1)
}
}
}
dfs1(target,k)
return res
}
题目来源:https://leetcode-cn.com/problems/all-nodes-distance-k-in-binary-tree/

浙公网安备 33010602011771号