863. 二叉树中所有距离为 K 的结点

863. 二叉树中所有距离为 K 的结点

863. 二叉树中所有距离为 K 的结点 (Medium)

给定一个二叉树(具有根结点 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 获知每个节点的父节点,再 BFS/DFS 得到距离 target 为 k 的节点集合


func distanceK(root *TreeNode, target *TreeNode, k int) []int {
	if k == 0 {
		return []int{target.Val}
	}

	parents := getParents(root)

	var res []int
	var dfs func(pre, cur *TreeNode, dist int)
	action := func(pre, cur, next *TreeNode, dist int) {
		if next != nil && next != pre {
			dfs(cur, next, dist+1)
		}
	}
	dfs = func(pre, cur *TreeNode, dist int) {
		if dist == k {
			res = append(res, cur.Val)
			return
		}
		action(pre, cur, cur.Left, dist)
		action(pre, cur, cur.Right, dist)
		action(pre, cur, parents[cur], dist)
	}
	dfs(nil, target, 0)
	return res
}

func getParents(root *TreeNode) map[*TreeNode]*TreeNode {
	parent := map[*TreeNode]*TreeNode{}
	var dfs func(cur, p *TreeNode)
	dfs = func(cur, p *TreeNode) {
		if cur == nil {
			return
		}
		parent[cur] = p
		dfs(cur.Left, cur)
		dfs(cur.Right, cur)
	}
	dfs(root, nil)
	return parent
}