Skip to content

Commit 9f96517

Browse files
committed
作业
1 parent 45f0078 commit 9f96517

3 files changed

Lines changed: 71 additions & 1 deletion

File tree

Week03/NOTE.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,7 @@
1-
学习笔记
1+
学习笔记
2+
3+
分治 即 把问题分为多个情况进行处理
4+
5+
回溯 : 吧多个情况的问题的结果进行统一处理
6+
7+
最近的题目 我好的都没有思路 只能看图解 然后进行五毒深掌了

Week03/TreeNode_Solution.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.algorithm.ok.week_3;
2+
3+
import com.algorithm.ok.week_2.TreeNode;
4+
5+
import java.util.HashMap;
6+
import java.util.Map;
7+
8+
public class TreeNode_Solution {
9+
10+
public Map<Integer, Integer> indexMap;
11+
12+
public TreeNode myBuildTree(int[] preorder, int[] inorder, int preorder_left, int preorder_right, int inorder_left, int inorder_right) {
13+
if (preorder_left > preorder_right) {
14+
return null;
15+
}
16+
17+
// 前序遍历中的第一个节点就是根节点
18+
int preorder_root = preorder_left;
19+
// 在中序遍历中定位根节点
20+
int inorder_root = indexMap.get(preorder[preorder_root]);
21+
22+
// 先把根节点建立出来
23+
TreeNode root = new TreeNode(preorder[preorder_root]);
24+
// 得到左子树中的节点数目
25+
int size_left_subtree = inorder_root - inorder_left;
26+
// 递归地构造左子树,并连接到根节点
27+
// 先序遍历中「从 左边界+1 开始的 size_left_subtree」个元素就对应了中序遍历中「从 左边界 开始到 根节点定位-1」的元素
28+
root.left = myBuildTree(preorder, inorder, preorder_left + 1, preorder_left + size_left_subtree, inorder_left, inorder_root - 1);
29+
// 递归地构造右子树,并连接到根节点
30+
// 先序遍历中「从 左边界+1+左子树节点数目 开始到 右边界」的元素就对应了中序遍历中「从 根节点定位+1 到 右边界」的元素
31+
root.right = myBuildTree(preorder, inorder, preorder_left + size_left_subtree + 1, preorder_right, inorder_root + 1, inorder_right);
32+
return root;
33+
}
34+
35+
public TreeNode buildTree(int[] preorder, int[] inorder) {
36+
int n = preorder.length;
37+
// 构造哈希映射,帮助我们快速定位根节点
38+
indexMap = new HashMap<Integer, Integer>();
39+
for (int i = 0; i < n; i++) {
40+
indexMap.put(inorder[i], i);
41+
}
42+
return myBuildTree(preorder, inorder, 0, n - 1, 0, n - 1);
43+
}
44+
45+
}

Week03/Two_TreeNode.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.algorithm.ok.week_3;
2+
3+
import com.algorithm.ok.week_2.TreeNode;
4+
5+
/***
6+
* 236. 二叉树的最近公共祖先
7+
*/
8+
public class Two_TreeNode {
9+
10+
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
11+
if(root == null || root == p || root == q) return root;
12+
TreeNode left = lowestCommonAncestor(root.left, p, q);
13+
TreeNode right = lowestCommonAncestor(root.right, p, q);
14+
if(left == null && right == null) return null; // 1.
15+
if(left == null) return right; // 3.
16+
if(right == null) return left; // 4.
17+
return root; // 2. if(left != null and right != null)
18+
}
19+
}

0 commit comments

Comments
 (0)