二叉树中所有距离为 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
代码结果
运行时间: 28 ms, 内存: 0.0 MB
/*
* 思路:
* 1. 将二叉树转化为图结构,使用Map存储每个结点和其相邻的结点。
* 2. 使用BFS遍历图找到距离为k的所有结点。
*/
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class Solution {
public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
Map<TreeNode, List<TreeNode>> graph = new HashMap<>();
buildGraph(root, null, graph);
Queue<TreeNode> queue = new LinkedList<>();
queue.add(target);
Set<TreeNode> visited = new HashSet<>();
visited.add(target);
int distance = 0;
while (!queue.isEmpty()) {
if (distance == k) break;
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
for (TreeNode neighbor : graph.get(node)) {
if (visited.add(neighbor)) {
queue.add(neighbor);
}
}
}
distance++;
}
return queue.stream().map(node -> node.val).collect(Collectors.toList());
}
private void buildGraph(TreeNode node, TreeNode parent, Map<TreeNode, List<TreeNode>> graph) {
if (node == null) return;
graph.computeIfAbsent(node, k -> new ArrayList<>());
if (parent != null) {
graph.get(node).add(parent);
graph.get(parent).add(node);
}
buildGraph(node.left, node, graph);
buildGraph(node.right, node, graph);
}
}
解释
方法:
这个题解使用了两个DFS遍历来解决问题。第一个DFS遍历从根节点开始,用于查找目标节点target并记录从根节点到目标节点的路径长度。在找到目标节点时,调用第二个DFS遍历subtree_add,将距离目标节点距离为k的所有节点值加入结果列表。在第一个DFS遍历中,如果当前节点到目标节点的距离为k,则将当前节点值加入结果列表;然后继续递归遍历另一个子树,并将距离加1。最后返回结果列表。
时间复杂度:
O(N)
空间复杂度:
O(N)
代码细节讲解
🦆
题解中的函数`subtree_add`的逻辑是如何确保它不会重复添加相同的节点到结果列表中?
▷🦆
在进行第一个DFS遍历时,如何处理当同时在左右子树中找到目标节点的情况?题解似乎只考虑了首次找到目标节点的路径。
▷🦆
题解中提到的`Vertex distance`是指顶点间的路径长度,这个定义是否意味着路径中包括起点和终点?
▷🦆
如果`k`的值大于树的最大高度,题解是否有处理这种边界情况,以避免不必要的递归?
▷