二叉树中所有距离为 K 的结点 · 8 月更文挑战

94 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第30天,点击查看活动详情

一、题目描述:

给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 k 。

返回到目标结点 target 距离为 k 的所有结点的值的列表。 答案可以以 任何顺序 返回。

示例 1:

img

输入: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)

链接:leetcode.cn/problems/al…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

首先利用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;
    }
}

四、总结:

image.png

掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐

希望对你有帮助

期待下次再见~

🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 ~关注从你我做起!