0%

代码解析

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
package com.demo.s106;

import java.util.Deque;
import java.util.LinkedList;

/**
* 从中序与后序遍历序列构造二叉树
* 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
*
* 来源:力扣(LeetCode)
* 链接:https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal
* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
*/
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}

public class Solution {

public TreeNode buildTree(int[] inorder, int[] postorder) {
if (postorder == null || postorder.length == 0) {
return null;
}
TreeNode root = new TreeNode(postorder[postorder.length - 1]);
Deque<TreeNode> stack = new LinkedList<TreeNode>();
stack.push(root);
int inorderIndex = inorder.length - 1;
for (int i = postorder.length - 2; i >= 0; i--) {
int postorderVal = postorder[i];
TreeNode node = stack.peek();
if (node.val != inorder[inorderIndex]) {
node.right = new TreeNode(postorderVal);
stack.push(node.right);
} else {
while (!stack.isEmpty() && stack.peek().val == inorder[inorderIndex]) {
node = stack.pop();
inorderIndex--;
}
node.left = new TreeNode(postorderVal);
stack.push(node.left);
}
}
return root;
}

}

代码解析

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
package com.demo.s105;

import java.util.HashMap;
import java.util.Map;

/**
* 从前序与中序遍历序列构造二叉树
* 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
*
* 来源:力扣(LeetCode)
* 链接:https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal
* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
*/
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}

public class Solution {

public TreeNode buildTree(int[] preorder, int[] inorder) {

Map<Integer, Integer> cache = new HashMap<>();
for(int i = 0; i< inorder.length;i++) {
cache.put(inorder[i], i);
}
return buildTree(cache, preorder, inorder, 0, preorder.length, 0, inorder.length);

}


public TreeNode buildTree( Map<Integer, Integer> cache, int[] preorder, int[] inorder, int pres, int pree, int inos, int inoe) {
if(pres >= pree) {
return null;
}
int index = cache.get(preorder[pres]);
TreeNode node = new TreeNode(preorder[pres]);
node.left = buildTree(cache, preorder, inorder, pres+1, pres+1 + index-inos, inos, index);
node.right = buildTree(cache, preorder, inorder, pres+1 + index-inos, pree, index+1, inoe);
return node;
}
}

代码解析

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
package com.demo.s104;

/**
* 二叉树的最大深度
* 给定一个二叉树,找出其最大深度。
*
* 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
*
* 说明: 叶子节点是指没有子节点的节点。
*
* 示例:
* 给定二叉树 [3,9,20,null,null,15,7],
*
* 3
* / \
* 9 20
* / \
* 15 7
* 返回它的最大深度 3 。
*
* 来源:力扣(LeetCode)
* 链接:https://leetcode.cn/problems/maximum-depth-of-binary-tree
* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
*/
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
public class Solution {

public int maxDepth(TreeNode root) {
//到叶子节点结束
if(root == null) {
return 0;
} else {
//左子树最大深度
int left = maxDepth(root.left);
//右子树最大深度
int right = maxDepth(root.right);
//最大值
return Math.max(left, right) + 1;
}
}
}

代码解析

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
package com.demo.s103;

import java.util.*;

/**
* 二叉树的锯齿形层序遍历
* 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
*/
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
public class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
//定义返回结果集
List<List<Integer>> ret = new ArrayList<>();
if(root == null) {
return ret;
}
//定义队列
Queue<TreeNode> queue = new LinkedList();
//放入根节点
queue.offer(root);
//定义顺序
boolean zig = true;
//从队列取值
while(queue.size() != 0) {
int size = queue.size();
//每层单独存放到对应的链表中,头插尾插 根据zig区分
Deque<Integer> level = new LinkedList();
for(int i = 0 ;i < size; i ++) {
//队列取值
TreeNode cur = queue.poll();
if(zig) {
level.offerLast(cur.val);
} else {
level.offerFirst(cur.val);
}
//当前节点不为null,取下一层,从左往右
if(cur.left != null) {
queue.offer(cur.left);
}
if(cur.right != null) {
queue.offer(cur.right);
}

}
//每下层更新下 zig
zig = !zig;
ret.add(new LinkedList(level));

}
return ret;
}
}

代码解析

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
package com.demo.s102;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
* 二叉树的层序遍历
* 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
*/
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
public class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ret = new ArrayList();
if(root == null) {
return ret;
}

Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
while(queue.size() != 0) {
List<Integer> level = new ArrayList<Integer>();
int size = queue.size();
for(int i = 0; i< size; i++) {
TreeNode cur = queue.poll();
level.add(cur.val);
if(cur.left != null) {
queue.offer(cur.left);
}
if(cur.right != null) {
queue.offer(cur.right);
}
}
ret.add(level);

}
return ret;


}
}

代码解析

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
package com.demo.s101;

/**
* 对称二叉树
* 给你一个二叉树的根节点 root , 检查它是否轴对称。
*/
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}

public class Solution {
public boolean isSymmetric(TreeNode root) {
return check(root, root);
}

public boolean check(TreeNode p, TreeNode q) {
if (p == null && q == null) {
return true;
}
if (p == null || q == null) {
return false;
}
return p.val == q.val && check(p.left, q.right) && check(p.right, q.left);
}

}

代码解析

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
package com.demo.s100;

/**
* 相同的树
* 给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
*
* 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
*/
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}

public class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null && q == null) {
return true;
} else if (p == null || q == null) {
return false;
} else if (p.val != q.val) {
return false;
} else {
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
}
}

代码解析

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
package com.demo.s10;

/**
* 正则表达式匹配
* 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。
*
* '.' 匹配任意单个字符
* '*' 匹配零个或多个前面的那一个元素
* 所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。
*
* 来源:力扣(LeetCode)
* 链接:https://leetcode.cn/problems/regular-expression-matching
* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
*/
public class Solution {
public boolean isMatch(String s, String p) {
int m = s.length();
int n = p.length();

boolean[][] f = new boolean[m + 1][n + 1];
f[0][0] = true;
for (int i = 0; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
if (p.charAt(j - 1) == '*') {
f[i][j] = f[i][j - 2];
if (matches(s, p, i, j - 1)) {
f[i][j] = f[i][j] || f[i - 1][j];
}
} else {
if (matches(s, p, i, j)) {
f[i][j] = f[i - 1][j - 1];
}
}
}
}
return f[m][n];
}

public boolean matches(String s, String p, int i, int j) {
if (i == 0) {
return false;
}
if (p.charAt(j - 1) == '.') {
return true;
}
return s.charAt(i - 1) == p.charAt(j - 1);
}
}

代码解析

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
package com.demo.s1;

import java.util.HashMap;
import java.util.Map;

/**
* 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
*/
public class Solution {

public int[] twoSum(int[] nums, int target) {
//定义返回结果
int[] ret = new int[2];
//缓存出现过的数<数字和下标>
Map<Integer, Integer> cache = new HashMap<Integer, Integer>();
for(int i =0; i< nums.length; i++) {
//另一个数字之前出现过
if(cache.containsKey(target -nums[i] )) {
ret[0] = cache.get(target -nums[i]);
ret[1] = i;
break;
} else {
//没出现过则缓存下来
cache.put(nums[i], i);
}
}
return ret;
}
public static void main(String[] args) {
int[] nums = new int[]{1,2,3,4,5};
int target = 5;
new Solution().twoSum(nums, target);
}
}