forked from armankhondker/leetcode-solutions
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpopulateNextPointersInEachNodeII.java
130 lines (105 loc) · 3.4 KB
/
populateNextPointersInEachNodeII.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Given a binary tree
// struct Node {
// int val;
// Node *left;
// Node *right;
// Node *next;
// }
// Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to NULL.
// Initially, all next pointers are set to NULL.
/*
// Definition for a Node.
class Node {
public int val;
public Node left;
public Node right;
public Node next;
public Node() {}
public Node(int _val) {
val = _val;
}
public Node(int _val, Node _left, Node _right, Node _next) {
val = _val;
left = _left;
right = _right;
next = _next;
}
};
*/
//Nonoptimal level order traversal (BFS)
//O(N) TC
//O(N) SC
class Solution {
public Node connect(Node root) {
if (root == null) {
return root;
}
// Initialize a queue data structure which contains
// just the root of the tree
Queue<Node> Q = new LinkedList<Node>();
Q.add(root);
// Outer while loop which iterates over
// each level
while (Q.size() > 0) {
// Note the size of the queue
int size = Q.size();
// Iterate over all the nodes on the current level
for(int i = 0; i < size; i++) {
// Pop a node from the front of the queue
Node node = Q.poll();
// This check is important. We don't want to
// establish any wrong connections. The queue will
// contain nodes from 2 levels at most at any
// point in time. This check ensures we only
// don't establish next pointers beyond the end
// of a level
if (i < size - 1) {
node.next = Q.peek();
}
// Add the children, if any, to the back of
// the queue
if (node.left != null) {
Q.add(node.left);
}
if (node.right != null) {
Q.add(node.right);
}
}
}
// Since the tree has now been modified, return the root node
return root;
}
}
//OPTIMAL SOLUTION TRY NOT TO IMPLEMNENT THIS, VERYYY HARD
//TC: O(N)
//SC: O(1)
//logic is to basically save space by using previously established next pointers
public class Solution {
public void connect(TreeLinkNode root) {
TreeLinkNode head=root;//The left most node in the lower level
TreeLinkNode prev=null;//The previous node in the lower level
TreeLinkNode curr=null;//The current node in the upper level
while (head!=null){
curr=head;
prev=null;
head=null;
while (curr!=null){
if (curr.left!=null){
if (prev!=null)
prev.next=curr.left;
else
head=curr.left;
prev=curr.left;
}
if (curr.right!=null){
if (prev!=null)
prev.next=curr.right;
else
head=curr.right;
prev=curr.right;
}
curr=curr.next;
}
}
}
}