863 All nodes in distance k in binary tree

https://leetcode.com/problems/all-nodes-distance-k-in-binary-tree/

最直接的想法就是重新建图然后从target开始做bfs:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    List<Integer> ans = new ArrayList<>();
    public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
        Map<TreeNode, Set<TreeNode>> map = new HashMap<>();
        Queue<TreeNode> queue = new ArrayDeque<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            Set<TreeNode> set = map.get(node);
            if (set == null) set = new HashSet<>();
            if (node.left != null) {
                set.add(node.left);
                queue.offer(node.left);
                Set<TreeNode> cset = map.get(node.left);
                if (cset == null) cset = new HashSet<>();
                cset.add(node);
                map.put(node.left, cset);
            }
            if (node.right != null) {
                set.add(node.right);
                queue.offer(node.right);
                Set<TreeNode> cset = map.get(node.right);
                if (cset == null) cset = new HashSet<>();
                cset.add(node);
                map.put(node.right, cset);
            }
            map.put(node, set);
        }
        int len = 0;
        queue.offer(target);
        Set<TreeNode> visited = new HashSet<>();
        while (!queue.isEmpty()) {
            int size = queue.size();
            for (int s = 0; s < size; s++) {
                TreeNode node = queue.poll();
                if (visited.contains(node)) continue;
                visited.add(node);
                if (len == k) ans.add(node.val);
                for (TreeNode next : map.get(node)) {
                    queue.offer(next);
                }
            }
            len++;
            if (len > k) break;
        }
        return ans;
    }
}

或者做dfs,注意这种把树看成图的思想,在需要往上走的时候很有用

Last updated