LeetCode 863. All Nodes Distance K in Binary Tree

原题链接在这里:https://leetcode.com/problems/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.

Example 1:

Input: root = 2

Output: [7,4,1]

Explanation: 
The nodes that are a distance 2 from the target node (with value 5)
have values 7, 4, and 1.

LeetCode 863. All Nodes Distance K in Binary Tree

Note that the inputs "root" and "target" are actually TreeNodes.
The descriptions of the inputs above are just serializations of these objects.

Note:

  1. The given tree is non-empty.
  2. Each node in the tree has unique values 0 <= node.val <= 500.
  3. The target node is a node in the tree.
  4. 0 <= K <= 1000.

题解:

Clone this tree with new type of Node containing a pointer to parent.

Find the cloned target node and do BFS from it.

Time Complexity: O(n). Deep clone takes O(n). BFS takes O(n).

Time Complexity: O(n). Regardless res.

AC Java:

 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 class Solution {
11     Node clonedTargetNode;
12     public List<Integer> distanceK(TreeNode root, TreeNode target, int K) {
13         List<Integer> res = new ArrayList<Integer>();
14         if(root == null){
15             return res;
16         }
17         
18         deepClone(root, null, target);
19         LinkedList<Node> que = new LinkedList<Node>();
20         que.add(clonedTargetNode);
21         
22         HashSet<Node> used = new HashSet<Node>();
23         used.add(clonedTargetNode);
24         while(!que.isEmpty()){
25             int size = que.size();
26             if(K==0){
27                 for(int i = 0; i<size; i++){
28                     res.add(que.poll().val);
29                 }
30                 
31                 return res;
32             }
33             
34             for(int i = 0; i<size; i++){
35                 Node cur = que.poll();
36                 if(cur.parent != null && !used.contains(cur.parent)){
37                     que.add(cur.parent);
38                     used.add(cur.parent);
39                 }
40                 
41                 if(cur.left != null && !used.contains(cur.left)){
42                     que.add(cur.left);
43                     used.add(cur.left);
44                 }
45                 
46                 if(cur.right != null && !used.contains(cur.right)){
47                     que.add(cur.right);
48                     used.add(cur.right);
49                 }
50             }
51             
52             K--;
53         }
54         
55         return res;
56     }
57     
58     private Node deepClone(TreeNode root, Node parent, TreeNode target){
59         if(root == null){
60             return null;
61         }
62         
63         Node clonedRoot = new Node(root.val);
64         if(root == target){
65             clonedTargetNode = clonedRoot;
66         }
67         
68         clonedRoot.parent = parent;
69         clonedRoot.left = deepClone(root.left, clonedRoot, target);
70         clonedRoot.right = deepClone(root.right, clonedRoot, target);
71         return clonedRoot;
72     }
73 }
74 
75 class Node{
76     int val;
77     Node parent;
78     Node left;
79     Node right;
80     Node(int x){
81         this.val = x;
82     }
83 }