|
17 | 17 | */
|
18 | 18 |
|
19 | 19 | class Solution {
|
20 |
| - public NodeCopy copyRandomBinaryTree(Node root) { |
21 |
| - if (root == null) { |
22 |
| - return null; |
23 |
| - } |
24 |
| - Queue<Node> queue = new LinkedList<>(); |
25 |
| - Map<Node, NodeCopy> map = new HashMap<>(); |
26 |
| - queue.add(root); |
27 |
| - while (!queue.isEmpty()) { |
28 |
| - int size = queue.size(); |
29 |
| - while (size-- > 0) { |
30 |
| - Node removed = queue.remove(); |
31 |
| - map.put(removed, new NodeCopy(removed.val)); |
32 |
| - if (removed.left != null) { |
33 |
| - queue.add(removed.left); |
34 |
| - } |
35 |
| - if (removed.right != null) { |
36 |
| - queue.add(removed.right); |
| 20 | + public NodeCopy copyRandomBinaryTree(Node root) { |
| 21 | + if (root == null) { |
| 22 | + return null; |
37 | 23 | }
|
38 |
| - } |
| 24 | + Map<Node, NodeCopy> map = new HashMap<>(); |
| 25 | + copyOnlyNode(root, map); |
| 26 | + copyNodePointers(root, map); |
| 27 | + return map.get(root); |
39 | 28 | }
|
40 |
| - queue.add(root); |
41 |
| - while (!queue.isEmpty()) { |
42 |
| - int size = queue.size(); |
43 |
| - while (size-- > 0) { |
44 |
| - Node removed = queue.remove(); |
45 |
| - if (removed.left != null) { |
46 |
| - queue.add(removed.left); |
47 |
| - map.get(removed).left = map.get(removed.left); |
| 29 | + |
| 30 | + private void copyNodePointers(Node root, Map<Node, NodeCopy> map) { |
| 31 | + Queue<Node> queue = new LinkedList<>(); |
| 32 | + queue.add(root); |
| 33 | + while (!queue.isEmpty()) { |
| 34 | + Node removed = queue.remove(); |
| 35 | + NodeCopy copied = map.get(removed); |
| 36 | + if (removed.left != null) { |
| 37 | + queue.add(removed.left); |
| 38 | + copied.left = map.get(removed.left); |
| 39 | + } |
| 40 | + if (removed.right != null) { |
| 41 | + queue.add(removed.right); |
| 42 | + copied.right = map.get(removed.right); |
| 43 | + } |
| 44 | + if (removed.random != null) { |
| 45 | + copied.random = map.get(removed.random); |
| 46 | + } |
48 | 47 | }
|
49 |
| - if (removed.right != null) { |
50 |
| - queue.add(removed.right); |
51 |
| - map.get(removed).right = map.get(removed.right); |
52 |
| - } |
53 |
| - if (removed.random != null) { |
54 |
| - map.get(removed).random = map.get(removed.random); |
| 48 | + } |
| 49 | + |
| 50 | + private void copyOnlyNode(Node root, Map<Node, NodeCopy> map) { |
| 51 | + if (root == null) { |
| 52 | + return; |
55 | 53 | }
|
56 |
| - } |
| 54 | + NodeCopy copiedNode = new NodeCopy(root.val); |
| 55 | + map.put(root, copiedNode); |
| 56 | + copyOnlyNode(root.left, map); |
| 57 | + copyOnlyNode(root.right, map); |
57 | 58 | }
|
58 |
| - return map.get(root); |
59 |
| - } |
60 | 59 | }
|
0 commit comments