【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 <= 500
  • Node.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/

 

posted @ 2022-02-23 15:21  梦想是能睡八小时的猪  阅读(39)  评论(0)    收藏  举报