Skip to content

Commit 0e12446

Browse files
authored
Added tasks 144-146.
1 parent b5de54e commit 0e12446

File tree

6 files changed

+260
-0
lines changed

6 files changed

+260
-0
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package g0101_0200.s0144_binary_tree_preorder_traversal;
2+
3+
import com_github_leetcode.TreeNode;
4+
import java.util.ArrayList;
5+
import java.util.List;
6+
import java.util.Stack;
7+
8+
/*
9+
* Definition for a binary tree node.
10+
* public class TreeNode {
11+
* int val;
12+
* TreeNode left;
13+
* TreeNode right;
14+
* TreeNode() {}
15+
* TreeNode(int val) { this.val = val; }
16+
* TreeNode(int val, TreeNode left, TreeNode right) {
17+
* this.val = val;
18+
* this.left = left;
19+
* this.right = right;
20+
* }
21+
* }
22+
*/
23+
@SuppressWarnings("java:S1149")
24+
public class Solution {
25+
public List<Integer> preorderTraversal(TreeNode root) {
26+
List<Integer> result = new ArrayList<>();
27+
if (root == null) {
28+
return result;
29+
}
30+
Stack<TreeNode> stack = new Stack<>();
31+
TreeNode current = root;
32+
while (current != null || !stack.isEmpty()) {
33+
while (current != null) {
34+
result.add(current.val);
35+
stack.push(current.right);
36+
current = current.left;
37+
}
38+
current = stack.pop();
39+
}
40+
return result;
41+
}
42+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package g0101_0200.s0145_binary_tree_postorder_traversal;
2+
3+
import com_github_leetcode.TreeNode;
4+
import java.util.ArrayList;
5+
import java.util.List;
6+
7+
/*
8+
* Definition for a binary tree node.
9+
* public class TreeNode {
10+
* int val;
11+
* TreeNode left;
12+
* TreeNode right;
13+
* TreeNode() {}
14+
* TreeNode(int val) { this.val = val; }
15+
* TreeNode(int val, TreeNode left, TreeNode right) {
16+
* this.val = val;
17+
* this.left = left;
18+
* this.right = right;
19+
* }
20+
* }
21+
*/
22+
public class Solution {
23+
public List<Integer> postorderTraversal(TreeNode root) {
24+
if (root == null) {
25+
return new ArrayList<>();
26+
}
27+
List<Integer> res = postorderTraversal(root.left);
28+
res.addAll(postorderTraversal(root.right));
29+
res.add(root.val);
30+
return res;
31+
}
32+
}
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package g0101_0200.s0146_lru_cache;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
public class LRUCache {
7+
int capacity;
8+
Map<Integer, LRUCacheNode> cacheMap = new HashMap<>();
9+
// insert here
10+
LRUCacheNode head;
11+
// remove here
12+
LRUCacheNode tail;
13+
14+
public LRUCache(int cap) {
15+
capacity = cap;
16+
}
17+
18+
public int get(int key) {
19+
LRUCacheNode val = cacheMap.get(key);
20+
if (val == null) {
21+
return -1;
22+
}
23+
moveToHead(val);
24+
return val.value;
25+
}
26+
27+
/*
28+
* Scenarios :
29+
* 1. Value key is already present.
30+
* update
31+
* move node to head
32+
* 2. cache is not full
33+
* cache is empty (create node and assign head and tail)
34+
* cache is partially empty (add node to head and update head pointer)
35+
* 3. cache is full
36+
* remove node at tail, update head, tail pointers
37+
* Recursively call put
38+
*
39+
*
40+
* move node to head Scenarios
41+
* 1. node is at head
42+
* 2. node is at tail
43+
* 3. node is in middle
44+
*
45+
*/
46+
public void put(int key, int value) {
47+
LRUCacheNode valNode = cacheMap.get(key);
48+
if (valNode != null) {
49+
valNode.value = value;
50+
moveToHead(valNode);
51+
} else {
52+
if (cacheMap.size() < capacity) {
53+
if (cacheMap.size() == 0) {
54+
LRUCacheNode node = new LRUCacheNode(key, value);
55+
cacheMap.put(key, node);
56+
head = node;
57+
tail = node;
58+
} else {
59+
LRUCacheNode node = new LRUCacheNode(key, value);
60+
cacheMap.put(key, node);
61+
node.next = head;
62+
head.prev = node;
63+
head = node;
64+
}
65+
} else {
66+
// remove from tail
67+
LRUCacheNode last = tail;
68+
tail = last.prev;
69+
if (tail != null) {
70+
tail.next = null;
71+
}
72+
cacheMap.remove(last.key);
73+
if (cacheMap.size() == 0) {
74+
head = null;
75+
}
76+
// Call recursively
77+
put(key, value);
78+
}
79+
}
80+
}
81+
82+
/*
83+
* check for 3 conditions
84+
* 1. node is already at head
85+
* 2. Node is tail node
86+
* 3. Node in middle node
87+
*/
88+
private void moveToHead(LRUCacheNode node) {
89+
if (node == head) {
90+
return;
91+
}
92+
if (node == tail) {
93+
tail = node.prev;
94+
}
95+
// node is not head, it should have some valid prev node
96+
LRUCacheNode prev = node.prev;
97+
LRUCacheNode next = node.next;
98+
prev.next = next;
99+
if (next != null) {
100+
next.prev = prev;
101+
}
102+
node.prev = null;
103+
node.next = head;
104+
head.prev = node;
105+
head = node;
106+
}
107+
}
108+
109+
class LRUCacheNode {
110+
int key;
111+
int value;
112+
LRUCacheNode prev;
113+
LRUCacheNode next;
114+
115+
public LRUCacheNode(int k, int v) {
116+
key = k;
117+
value = v;
118+
}
119+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package g0101_0200.s0144_binary_tree_preorder_traversal;
2+
3+
import static org.hamcrest.CoreMatchers.equalTo;
4+
import static org.hamcrest.MatcherAssert.assertThat;
5+
6+
import com_github_leetcode.TreeNode;
7+
import java.util.Arrays;
8+
import org.junit.Test;
9+
10+
public class SolutionTest {
11+
@Test
12+
public void preorderTraversal() {
13+
TreeNode treeNode = new TreeNode(1);
14+
treeNode.right = new TreeNode(2);
15+
treeNode.right.left = new TreeNode(3);
16+
assertThat(new Solution().preorderTraversal(treeNode), equalTo(Arrays.asList(1, 2, 3)));
17+
}
18+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package g0101_0200.s0145_binary_tree_postorder_traversal;
2+
3+
import static org.hamcrest.CoreMatchers.equalTo;
4+
import static org.hamcrest.MatcherAssert.assertThat;
5+
6+
import com_github_leetcode.TreeNode;
7+
import java.util.Arrays;
8+
import org.junit.Test;
9+
10+
public class SolutionTest {
11+
@Test
12+
public void postorderTraversal() {
13+
TreeNode treeNode = new TreeNode(1);
14+
treeNode.right = new TreeNode(2);
15+
treeNode.right.left = new TreeNode(3);
16+
assertThat(new Solution().postorderTraversal(treeNode), equalTo(Arrays.asList(3, 2, 1)));
17+
}
18+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package g0101_0200.s0146_lru_cache;
2+
3+
import static org.hamcrest.CoreMatchers.equalTo;
4+
import static org.hamcrest.MatcherAssert.assertThat;
5+
6+
import org.junit.Test;
7+
8+
public class LRUCacheTest {
9+
@Test
10+
public void lRUCache() {
11+
LRUCache lRUCache = new LRUCache(2);
12+
// cache is {1=1}
13+
lRUCache.put(1, 1);
14+
// cache is {1=1, 2=2}
15+
lRUCache.put(2, 2);
16+
// return 1
17+
assertThat(lRUCache.get(1), equalTo(1));
18+
// LRU key was 2, evicts key 2, cache is {1=1, 3=3}
19+
lRUCache.put(3, 3);
20+
// returns -1 (not found)
21+
assertThat(lRUCache.get(2), equalTo(-1));
22+
// LRU key was 1, evicts key 1, cache is {4=4, 3=3}
23+
lRUCache.put(4, 4);
24+
// return -1 (not found)
25+
assertThat(lRUCache.get(1), equalTo(-1));
26+
// return 3
27+
assertThat(lRUCache.get(3), equalTo(3));
28+
// return 4
29+
assertThat(lRUCache.get(4), equalTo(4));
30+
}
31+
}

0 commit comments

Comments
 (0)