Skip to content

Commit d9a4b70

Browse files
committed
practice
1 parent 33466d4 commit d9a4b70

13 files changed

+299
-126
lines changed

src/problems/leetcode/BinaryTreeZigzagLevelOrderTraversal.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,35 @@ public String toString() {
2828
}
2929
}
3030

31+
public List<List<Integer>> zigzagLevelOrder2(TreeNode root) {
32+
List<List<Integer>> levels = new ArrayList<>();
33+
traverse(root, 0, levels);
34+
35+
for (int i = 1; i < levels.size(); i += 2) {
36+
// System.out.println(levels.get(i));
37+
Collections.reverse(levels.get(i));
38+
}
39+
40+
return levels;
41+
}
42+
43+
public void traverse(TreeNode node, int level, List<List<Integer>> levels) {
44+
if (node == null) {
45+
return;
46+
}
47+
48+
List<Integer> vals;
49+
if (levels.size() <= level) {
50+
vals = new ArrayList<>();
51+
levels.add(vals);
52+
} else {
53+
vals = levels.get(level);
54+
}
55+
vals.add(node.val);
56+
traverse(node.left, level + 1, levels);
57+
traverse(node.right, level + 1, levels);
58+
}
59+
3160
public static List<List<Integer>> zigzagLevelOrder(TreeNode root) {
3261
if (root == null) {
3362
return Collections.emptyList();
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package problems.leetcode;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
// https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/
7+
public class ConstructBinaryTreeFromInorderAndPostorderTraversals {
8+
9+
private static class TreeNode {
10+
int val;
11+
TreeNode left;
12+
TreeNode right;
13+
14+
TreeNode(int x) {
15+
val = x;
16+
}
17+
18+
@Override
19+
public String toString() {
20+
return "TreeNode{" + "val=" + val + '}';
21+
}
22+
}
23+
24+
public static TreeNode buildTree(int[] inorder, int[] postorder) {
25+
Map<Integer, Integer> inorderIndices = new HashMap<>();
26+
for (int i = 0; i < inorder.length; i++) {
27+
inorderIndices.put(inorder[i], i);
28+
}
29+
return buildTree(inorder, postorder, inorderIndices, 0, postorder.length - 1, 0, inorder.length - 1);
30+
}
31+
32+
private static TreeNode buildTree(int[] inorder, int[] postorder, Map<Integer, Integer> inorderIndices, int inStart,
33+
int inEnd, int postStart, int postEnd) {
34+
if (postStart > postEnd) {
35+
return null;
36+
}
37+
38+
int val = postorder[postEnd];
39+
TreeNode node = new TreeNode(val);
40+
int diff = inEnd - inorderIndices.get(val);
41+
if (diff > 0) {
42+
node.right = buildTree(inorder, postorder, inorderIndices, inEnd - diff + 1,
43+
inEnd, postEnd - diff, postEnd - 1);
44+
}
45+
node.left = buildTree(inorder, postorder, inorderIndices, inStart,
46+
inEnd - diff - 1, postStart, postEnd - diff - 1);
47+
48+
return node;
49+
}
50+
51+
public static void main(String[] args) {
52+
// TreeNode root = new TreeNode(3);
53+
// root.left = new TreeNode(9);
54+
// root.right = new TreeNode(20);
55+
// root.right.left = new TreeNode(15);
56+
// root.right.right = new TreeNode(7);
57+
58+
TreeNode root = buildTree(new int[] {9, 6, 3, 15, 20, 7}, new int[]{6, 9, 15, 7, 20, 3});
59+
System.out.println();
60+
}
61+
62+
}
Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package problems.leetcode;
22

3+
import java.util.HashMap;
4+
import java.util.Map;
5+
36
/**
47
* https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
58
*/
@@ -20,47 +23,46 @@ public String toString() {
2023
}
2124
}
2225

26+
// runtime: O(N)
27+
// space: O(N)
2328
public static TreeNode buildTree(int[] preorder, int[] inorder) {
24-
return buildTree(preorder, inorder, 0, 0, preorder.length, inorder.length);
29+
Map<Integer, Integer> inorderIndices = new HashMap<>();
30+
for (int i = 0; i < inorder.length; i++) {
31+
inorderIndices.put(inorder[i], i);
32+
}
33+
return buildTree(preorder, inorder, inorderIndices, 0, preorder.length, 0, inorder.length);
2534
}
2635

27-
static TreeNode buildTree(int[] preorder, int[] inorder, int startP, int startI, int endP, int endI) {
28-
if (startP == endP) {
36+
private static TreeNode buildTree(int[] preorder, int[] inorder, Map<Integer, Integer> inorderIndices, int preStart,
37+
int preEnd, int inStart, int inEnd) {
38+
if (preStart == preEnd) {
2939
return null;
3040
}
3141

32-
TreeNode node = new TreeNode(preorder[startP]);
33-
34-
int diff = getDiff(preorder[startP], inorder, startI, endI);
42+
int val = preorder[preStart];
43+
TreeNode node = new TreeNode(val);
44+
int diff = inorderIndices.get(val) - inStart;
3545
if (diff > 0) {
36-
node.left = buildTree(preorder, inorder, startP + 1, startI, startP + 1 + diff, startI + diff);
46+
node.left = buildTree(preorder, inorder, inorderIndices, 1 + preStart, 1 + preStart + diff, inStart,
47+
inStart + diff);
3748
}
38-
node.right = buildTree(preorder, inorder, startP + diff + 1, startI + diff + 1, endP, endI);
49+
node.right = buildTree(preorder, inorder, inorderIndices, 1 + preStart + diff, preEnd, 1 + inStart + diff,
50+
inEnd);
3951

4052
return node;
4153
}
4254

43-
private static int getDiff(int node, int[] inorder, int startI, int endI) {
44-
for (int i = startI; i < endI; i++) {
45-
if (node == inorder[i]) {
46-
return i - startI;
47-
}
48-
}
49-
50-
throw new IllegalArgumentException();
51-
}
52-
5355
public static void main(String[] args) {
54-
// TreeNode root = buildTree(new int[]{1, 3}, new int[]{1, 3});
55-
// TreeNode root = buildTree(new int[]{1, 2}, new int[]{2, 1});
56-
// TreeNode root = buildTree(new int[]{1, 2, 3}, new int[]{2, 1, 3});
57-
// TreeNode root = buildTree(new int[]{1, 2, 3}, new int[]{3, 2, 1});
58-
// TreeNode root = buildTree(new int[]{1, 2, 3, 4}, new int[]{3, 2, 4, 1});
59-
// TreeNode root = buildTree(new int[]{1, 2, 3}, new int[]{2, 3, 1});
60-
// TreeNode root = buildTree(new int[]{1, 2, 3}, new int[]{1, 3, 2});
61-
// TreeNode root = buildTree(new int[]{1, 2, 3}, new int[]{1, 2, 3});
62-
// TreeNode root = buildTree(new int[]{1, 2, 3, 4}, new int[]{1, 3, 2, 4});
63-
TreeNode root = buildTree(new int[]{3, 9, 20, 15, 7}, new int[]{9, 3, 15, 20, 7});
56+
// TreeNode root = buildTree(new int[]{1, 3}, new int[]{1, 3});
57+
// TreeNode root = buildTree(new int[]{1, 2}, new int[]{2, 1});
58+
// TreeNode root = buildTree(new int[]{1, 2, 3}, new int[]{2, 1, 3});
59+
// TreeNode root = buildTree(new int[]{1, 2, 3}, new int[]{3, 2, 1});
60+
// TreeNode root = buildTree(new int[]{1, 2, 3, 4}, new int[]{3, 2, 4, 1});
61+
// TreeNode root = buildTree(new int[]{1, 2, 3}, new int[]{2, 3, 1});
62+
// TreeNode root = buildTree(new int[]{1, 2, 3}, new int[]{1, 3, 2});
63+
// TreeNode root = buildTree(new int[]{1, 2, 3}, new int[]{1, 2, 3});
64+
// TreeNode root = buildTree(new int[]{1, 2, 3, 4}, new int[]{1, 3, 2, 4});
65+
TreeNode root = buildTree(new int[] { 3, 9, 20, 15, 7 }, new int[] { 9, 3, 15, 20, 7 });
6466
System.out.println();
6567
}
6668
}

src/problems/leetcode/ConvertSortedArrayToBinarySearchTree.java

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,25 +24,26 @@ public String toString() {
2424

2525

2626
public static TreeNode sortedArrayToBST(int[] nums) {
27-
return nums != null ? sortedArrayToBST(nums, 0, nums.length) : null;
27+
if (nums == null || nums.length < 1) {
28+
return null;
29+
}
30+
31+
return convert(nums, 0, nums.length - 1);
2832
}
2933

30-
// start: inclusive, end: exclusive
31-
private static TreeNode sortedArrayToBST(int[] nums, int start, int end) {
32-
if (start >= end) {
34+
private static TreeNode convert(int[] nums, int l, int r) {
35+
if (l > r) {
3336
return null;
34-
} else if (start == end - 1) {
35-
return new TreeNode(nums[start]);
3637
}
3738

38-
int mid = start + (end - start) / 2;
39-
TreeNode node = new TreeNode(nums[mid]);
40-
node.left = sortedArrayToBST(nums, start, mid);
41-
node.right = sortedArrayToBST(nums, mid + 1, end);
39+
int m = (l + r) / 2;
40+
TreeNode root = new TreeNode(nums[m]);
41+
root.left = convert(nums, l, m - 1);
42+
root.right = convert(nums, m + 1, r);
4243

43-
return node;
44+
return root;
4445
}
45-
46+
4647
public static void main(String[] args) {
4748
int[] nums = {0, 1, 2};
4849
TreeNode root = sortedArrayToBST(nums);

src/problems/leetcode/LargestRectangleInHistogram.java

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,13 @@ public static void main(String[] args) {
2626
x x x x x x x x x
2727
x x x x x x x x x
2828
*/
29-
3029
int[] heights2 = {3, 3, 4, 3, 4, 5, 3, 2, 2};
3130

32-
int largest = largestRectangleArea(heights2);
33-
System.out.println(largest);
31+
System.out.println(largestRectangleArea(heights2));
3432
}
3533

34+
// runtime: O(N)
35+
// space: O(1)
3636
public static int largestRectangleArea(int[] heights) {
3737
// {x, h}
3838
Deque<int[]> stack = new ArrayDeque<>();
@@ -47,22 +47,20 @@ public static int largestRectangleArea(int[] heights) {
4747
}
4848

4949
// pop all the heights which are greater than the current height
50-
int leftMostX = -1;
50+
int leftMost = -1;
5151
while (stack.size() > 0 && stack.peekLast()[1] > h) {
5252
int[] bar = stack.removeLast();
53-
int area = bar[1] * (i - bar[0]);
54-
maxArea = Math.max(maxArea, area);
55-
leftMostX = bar[0];
53+
maxArea = Math.max(maxArea, bar[1] * (i - bar[0]));
54+
leftMost = bar[0];
5655
}
5756

58-
stack.addLast(new int[]{leftMostX, h});
57+
stack.addLast(new int[]{leftMost, h});
5958
stack.addLast(new int[]{i, h});
6059
}
6160

6261
while (stack.size() > 0) {
6362
int[] bar = stack.removeLast();
64-
int area = bar[1] * (n - bar[0]);
65-
maxArea = Math.max(maxArea, area);
63+
maxArea = Math.max(maxArea, bar[1] * (n - bar[0]));
6664
}
6765

6866
return maxArea;
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package problems.leetcode;
2+
3+
4+
// https://leetcode.com/problems/maximum-depth-of-binary-tree
5+
public class MaximumDepthOfBinaryTree {
6+
7+
private static class TreeNode {
8+
int val;
9+
TreeNode left;
10+
TreeNode right;
11+
12+
TreeNode(int x) {
13+
val = x;
14+
}
15+
16+
@Override
17+
public String toString() {
18+
return "TreeNode{" +
19+
"val=" + val +
20+
'}';
21+
}
22+
}
23+
24+
public int maxDepth(TreeNode root) {
25+
return root != null ? 1 + Math.max(maxDepth(root.left), maxDepth(root.right)) : 0;
26+
}
27+
28+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package problems.leetcode;
2+
3+
// https://leetcode.com/problems/minimum-depth-of-binary-tree/
4+
public class MinDepthOfBinaryTree {
5+
6+
private static class TreeNode {
7+
int val;
8+
TreeNode left;
9+
TreeNode right;
10+
11+
TreeNode(int x) {
12+
val = x;
13+
}
14+
}
15+
16+
17+
private int minDepth = Integer.MAX_VALUE;
18+
19+
public int minDepth(TreeNode root) {
20+
traverse(root, 1);
21+
return minDepth != Integer.MAX_VALUE ? minDepth : 0;
22+
}
23+
24+
private void traverse(TreeNode root, int h) {
25+
if (root == null || h > minDepth) {
26+
return;
27+
} else if (root.left == null && root.right == null) {
28+
minDepth = Math.min(minDepth, h);
29+
}
30+
31+
traverse(root.left, h + 1);
32+
traverse(root.right, h + 1);
33+
}
34+
35+
}

src/problems/leetcode/PathSum.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package problems.leetcode;
2+
3+
// https://leetcode.com/problems/path-sum
4+
public class PathSum {
5+
6+
private static class TreeNode {
7+
int val;
8+
TreeNode left;
9+
TreeNode right;
10+
11+
TreeNode(int x) {
12+
val = x;
13+
}
14+
}
15+
16+
17+
public boolean hasPathSum(TreeNode root, int targetSum) {
18+
if (root == null) {
19+
return false;
20+
}
21+
22+
targetSum -= root.val;
23+
if (targetSum == 0 && root.left == null && root.right == null) {
24+
return true;
25+
}
26+
27+
return hasPathSum(root.left, targetSum) || hasPathSum(root.right, targetSum);
28+
}
29+
30+
}

0 commit comments

Comments
 (0)