-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathPopulateRightPointers.java
155 lines (136 loc) · 3.46 KB
/
PopulateRightPointers.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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/*https://leetcode.com/problems/populating-next-right-pointers-in-each-node/*/
class QueueNode
{
Node node;
QueueNode next;
QueueNode(Node node)
{
this.node = node;
}
}
class Queue
{
public QueueNode front, rear;
int size;
Queue()
{
size = 0;
}
public void enqueue(Node node)
{
if (rear == null)
{
rear = new QueueNode(node);
front = rear;
size = 1;
}
else
{
rear.next = new QueueNode(node);
rear = rear.next;
++size;
}
}
public QueueNode dequeue()
{
QueueNode returnNode = null;
if (front == rear)
{
returnNode = front;
front = rear = null;
size = 0;
}
else
{
returnNode = front;
front = front.next;
returnNode.next = null;
--size;
}
return returnNode;
}
public QueueNode checkFront()
{
return this.front;
}
public boolean isEmpty()
{
return size == 0 ? true : false;
}
public int getSize()
{
return this.size;
}
}
class Solution {
public Node connect(Node root) {
//base case
if (root == null) return null;
Queue queue = new Queue();
//add root to queue
queue.enqueue(root);
QueueNode currQueueNode = null, nextQueueNode = null; //two pointers for queue node
Node currNode = null, nextNode = null; //two pointers for tree node
//till queue has more elements
while (!queue.isEmpty())
{
//get the number of nodes in the current level
int currLevelSize = queue.getSize();
//for each node
for (int i = 0; i < currLevelSize; ++i)
{
//dequeue the node
currQueueNode = queue.dequeue();
currNode = currQueueNode.node;
//add its children
if (currNode.left != null) queue.enqueue(currNode.left);
if (currNode.right != null) queue.enqueue(currNode.right);
//store the next node on this level in another pointer
nextQueueNode = queue.checkFront();
//if its not the last node of the current level and the next node is not null, populate the pointer
if (i < currLevelSize-1 && nextQueueNode != null)
{
nextNode = nextQueueNode.node;
currNode.next = nextNode;
}
}
}
//return the root
return root;
}
}
/*
// 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;
}
};
*/
class Solution {
public Node connect(Node root) {
solve(root);
return root;
}
private void solve(Node root)
{
if (root == null) return;
if (root.left != null)
root.left.next = root.right;
if (root.right != null && root.next != null)
root.right.next = root.next.left;
solve(root.left);
solve(root.right);
}
}