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
+ // T.C - O(M+N) = O(N), N = no of nodes in BT, S.C = O(N)
11
+ class Solution {
12
+ public List <Integer > distanceK (TreeNode root , TreeNode target , int K ) {
13
+ HashMap <TreeNode , TreeNode > hm = new HashMap <>();
14
+ nodeParentMap (root , hm , null );// since root has no parent
15
+ HashSet <TreeNode > seen = new HashSet <>();
16
+ Queue <TreeNode > q = new LinkedList <>();
17
+ q .add (target );
18
+ seen .add (target );
19
+ int currentLayer = 0 ;
20
+ while (!q .isEmpty ()) {
21
+ if (currentLayer == K ) {
22
+ return getLayerFromQueue (q );
23
+ }
24
+ // processing all nodes in the layer
25
+ int layerSize = q .size ();
26
+ for (int i =0 ; i <layerSize ; i ++) {
27
+ TreeNode curNode = q .poll ();
28
+ if (curNode .left != null && !seen .contains (curNode .left )) {
29
+ seen .add (curNode .left );
30
+ q .add (curNode .left );
31
+ }
32
+ if (curNode .right != null && !seen .contains (curNode .right )) {
33
+ seen .add (curNode .right );
34
+ q .add (curNode .right );
35
+ }
36
+ TreeNode parent = hm .get (curNode );
37
+ if (parent != null && !seen .contains (parent )) {
38
+ seen .add (parent );
39
+ q .add (parent );
40
+ }
41
+ }
42
+ currentLayer ++;
43
+
44
+ }
45
+ return new ArrayList <>();
46
+ }
47
+
48
+ public void nodeParentMap (TreeNode root , HashMap <TreeNode , TreeNode > hm , TreeNode parent ) {
49
+ if (root == null ) return ;
50
+ hm .put (root , parent );
51
+ nodeParentMap (root .left , hm , root );
52
+ nodeParentMap (root .right , hm , root );
53
+ }
54
+
55
+ public List <Integer > getLayerFromQueue (Queue <TreeNode > q ) {
56
+ List <Integer > extractedLayer = new ArrayList <>();
57
+ for (TreeNode n : q ) {
58
+ extractedLayer .add (n .val );
59
+ }
60
+ return extractedLayer ;
61
+ }
62
+ }
0 commit comments