Skip to content

Commit 528e73a

Browse files
authored
Merge pull request #133 from yolophg/main
2 parents a944a26 + bff7a01 commit 528e73a

File tree

5 files changed

+152
-0
lines changed

5 files changed

+152
-0
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Time Complexity: O(n)
2+
// Space Complexity: O(n)
3+
4+
var levelOrder = function (root) {
5+
// if the root is null, return an empty array.
6+
if (root === null) return [];
7+
8+
const result = [];
9+
const queue = [root];
10+
11+
// while there are nodes in the queue,
12+
while (queue.length > 0) {
13+
const levelSize = queue.length;
14+
const currentLevel = [];
15+
16+
// loop nodes in the current level.
17+
for (let i = 0; i < levelSize; i++) {
18+
// dequeue the front node.
19+
const currentNode = queue.shift();
20+
// add value to the current level array.
21+
currentLevel.push(currentNode.val);
22+
// enqueue left child if exists.
23+
if (currentNode.left) queue.push(currentNode.left);
24+
// enqueue right child if exists.
25+
if (currentNode.right) queue.push(currentNode.right);
26+
}
27+
28+
// add the current level array to the result.
29+
result.push(currentLevel);
30+
}
31+
32+
return result;
33+
};
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Time Complexity: O(n)
2+
// Space Complexity: O(1)
3+
4+
var lowestCommonAncestor = function (root, p, q) {
5+
// start from the root.
6+
let current = root;
7+
8+
// traverse the tree.
9+
while (current !== null) {
10+
// if both p and q are greater than current node, LCA lies in the right.
11+
if (p.val > current.val && q.val > current.val) {
12+
current = current.right;
13+
}
14+
// if both p and q are smaller than current node, LCA lies in the left.
15+
else if (p.val < current.val && q.val < current.val) {
16+
current = current.left;
17+
}
18+
// if one of p or q is on one side and the other is on the other side, It's LCA.
19+
else {
20+
return current;
21+
}
22+
}
23+
24+
// if the tree is empty.
25+
return null;
26+
};
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Time Complexity: O(n)
2+
// Space Complexity: O(1)
3+
4+
var removeNthFromEnd = function (head, n) {
5+
// calculate the length of the linked list.
6+
let length = 0;
7+
let current = head;
8+
while (current !== null) {
9+
length++;
10+
current = current.next;
11+
}
12+
13+
// determine the position to remove from the start.
14+
let removeIndex = length - n;
15+
16+
// if the node to be removed is the head, return the next node.
17+
if (removeIndex === 0) {
18+
return head.next;
19+
}
20+
21+
// traverse to the node just before the node to be removed.
22+
current = head;
23+
for (let i = 0; i < removeIndex - 1; i++) {
24+
current = current.next;
25+
}
26+
27+
// remove the nth node from the end.
28+
current.next = current.next.next;
29+
30+
// return the modified list.
31+
return head;
32+
};

reorder-list/yolophg.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Time Complexity: O(n)
2+
// Space Complexity: O(n)
3+
4+
var reorderList = function (head) {
5+
// push all nodes onto a stack.
6+
let stack = [];
7+
let current = head;
8+
while (current) {
9+
stack.push(current);
10+
current = current.next;
11+
}
12+
13+
// reorder the list.
14+
let n = stack.length;
15+
current = head;
16+
17+
for (let i = 0; i < Math.floor(n / 2); i++) {
18+
let next = current.next;
19+
let last = stack.pop();
20+
21+
current.next = last;
22+
last.next = next;
23+
current = next;
24+
}
25+
// ensure the last node points to null.
26+
if (current) current.next = null;
27+
};
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Time Complexity: O(n)
2+
// Space Complexity: O(n)
3+
4+
var isValidBST = function (root) {
5+
if (root === null) {
6+
return true;
7+
}
8+
9+
// initialize a queue for BFS.
10+
let queue = [];
11+
queue.push({ node: root, min: -Infinity, max: Infinity });
12+
13+
while (queue.length > 0) {
14+
// dequeue the front one.
15+
let { node, min, max } = queue.shift();
16+
17+
// check the BST for the current node.
18+
if (node.val <= min || node.val >= max) {
19+
return false;
20+
}
21+
22+
// enqueue the left child with updated min and max.
23+
if (node.left !== null) {
24+
queue.push({ node: node.left, min: min, max: node.val });
25+
}
26+
27+
// enqueue the right child with updated min and max.
28+
if (node.right !== null) {
29+
queue.push({ node: node.right, min: node.val, max: max });
30+
}
31+
}
32+
33+
return true;
34+
};

0 commit comments

Comments
 (0)