携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第30天,点击查看活动详情
一、题目描述:
给定一个二叉树(具有根结点 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
来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
首先利用HashMap采用层序遍历,构建子节点指向父节点的关系图:子节点作为key,父节点作为value。这样就能够与原来的二叉树结构“结合”起来变成一个图。 通过map直接找到目标节点,从目标节点开始使用bfs进行遍历,每一趟遍历就将每一个节点的父节点以及左右孩子节点(如果有的话)加入下一趟遍历的队列中。 同时设置vis保存已经访问过的结点,防止重复访问。 一趟遍历结束之后,判断当前步数是否等于k,如果等于k,就可以直接将队列中的节点值直接作为结果返回了;如果不等于k,就开始下一趟遍历。
三、AC 代码:
public class Solusion {
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
Deque<TreeNode> deque = new ArrayDeque<>();
HashMap<TreeNode, TreeNode> map = new HashMap<>();
deque.addFirst(root);
while (!deque.isEmpty()) {
TreeNode node = deque.pollLast();
if (node.left != null) {
map.put(node.left, node);
deque.addFirst(node.left);
}
if (node.right != null) {
map.put(node.right, node);
deque.addFirst(node.right);
}
}
HashSet<TreeNode> vis = new HashSet<>();
deque.addFirst(target);
vis.add(target);
int step = 0;
List<Integer> ans = new ArrayList<>();
if (step==k) ans.add(deque.pollLast().val);
while (!deque.isEmpty()) {
int size = deque.size();
for (int i = 0; i < size; i++) {
TreeNode node = deque.pollLast();
if (map.containsKey(node) && !vis.contains(map.get(node))) {
deque.addFirst(map.get(node));
vis.add(map.get(node));
}
if (node.left != null && !vis.contains(node.left)) {
deque.addFirst(node.left);
vis.add(node.left);
}
if (node.right != null && !vis.contains(node.right)) {
deque.addFirst(node.right);
vis.add(node.right);
}
}
step++;
if (step == k) {
while (!deque.isEmpty()) {
ans.add(deque.pollLast().val);
}
}
}
return ans;
}
}
四、总结:
掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐
希望对你有帮助
期待下次再见~
🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 ~关注从你我做起!