【leetcode】【863】【All Nodes Distance K in Binary Tree】

题目:We are given a binary tree (with root node root), a target node, and an integer value K.
Return a list of the values of all nodes that have a distance K from the target node. The answer can be returned in any order.
解题思路:借鉴于https://leetcode.com/problems/all-nodes-distance-k-in-binary-tree/solution/
构造一个队列,把所有跟target距离相同的点用null分隔开,类似于树的广度优先搜索。
代码:

class TreeNode {
      int val;
      TreeNode left;
      TreeNode right;
      TreeNode(int x) { val = x; }
  }
Map<TreeNode,TreeNode> parent = new HashMap<>();
    public List<Integer> distanceK(TreeNode root, TreeNode target, int K) {

        findParent(root,null);
        //quene中每两个null之间的节点距target距离一样
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(null);
        queue.add(target);
        //visited存放已经遍历过的节点
        Set<TreeNode> visited = new HashSet<>();
        visited.add(null);
        visited.add(target);
        int dist = 0;
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            if (node == null) {
                //当node等于null时此时队列中的所有节点跟target距离相同
                if (dist == K) {       //如果此时就是距离为k的时候直接输出
                    ArrayList<Integer> ans = new ArrayList<>();
                    while (!queue.isEmpty()) ans.add(queue.poll().val);
                    return ans;
                } else {    //否则,再引入一个null,dist++代表这个null后面的节点跟k的距离
                    queue.offer(null);
                    dist++;
                }
            } else {
                //如果此时的是一个节点,那么我们引入他的子孙和父节点,使新引入的节点到k的距离
                //比他到k的距离大一,而且这些节点会以null为分界线
                if (!visited.contains(node.left)) {
                    queue.offer(node.left);
                    visited.add(node.left);
                }
                if (!visited.contains(node.right)) {
                    queue.offer(node.right);
                    visited.add(node.right);
                }
                if (!visited.contains(parent.get(node))) {
                    queue.offer(parent.get(node));
                    visited.add(parent.get(node));
                }
            }
        }
        return new ArrayList<>();
    }
    public void findParent(TreeNode node,TreeNode par){
        if(node == null)return;
        parent.put(node,par);
        findParent(node.left,node);
        findParent(node.right,node);
    }

猜你喜欢

转载自blog.csdn.net/u012503241/article/details/82924436