Skip to content

Commit e95236c

Browse files
committed
TraversalTest__从中序与后序遍历序列构造二叉树
1 parent c8ea069 commit e95236c

File tree

2 files changed

+80
-0
lines changed

2 files changed

+80
-0
lines changed

leetcode/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
- [x] [SumTest__路径总和](src/main/java/com/cpucode/binary/tree/path/sum/SumTest.java)
6868
- [x] [SumTest2__路径总和2](src/main/java/com/cpucode/binary/tree/path/sum/SumTest2.java)
6969
- [ ] [TraversalTest__从前序与中序遍历序列构造二叉树](src/main/java/com/cpucode/binary/tree/preorder/inorder/TraversalTest.java)
70+
- [ ] [TraversalTest__从中序与后序遍历序列构造二叉树](src/main/java/com/cpucode/binary/tree/inorder/postorder/TraversalTest.java)
7071

7172
------------------------
7273

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package com.cpucode.binary.tree.inorder.postorder;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
/**
7+
* 106. 从中序与后序遍历序列构造二叉树
8+
*
9+
* 题目描述
10+
* 根据一棵树的中序遍历与后序遍历构造二叉树。
11+
*
12+
* 注意:
13+
* 你可以假设树中没有重复的元素。
14+
*
15+
* 例如,给出
16+
* 中序遍历 inorder = [9,3,15,20,7]
17+
* 后序遍历 postorder = [9,15,7,20,3]
18+
* 返回如下的二叉树:
19+
*
20+
* 3
21+
* / \
22+
* 9 20
23+
* / \
24+
* 15 7
25+
* 解法
26+
* 思路同 105。
27+
*
28+
* @author : cpucode
29+
* @date : 2021/5/18
30+
* @time : 22:50
31+
* @github : https://github.com/CPU-Code
32+
* @csdn : https://blog.csdn.net/qq_44226094
33+
*/
34+
public class TraversalTest {
35+
private Map<Integer, Integer> indexes = new HashMap<>();
36+
37+
public static void main(String[] args) {
38+
39+
}
40+
41+
public TreeNode buildTree(int[] inorder, int[] postorder) {
42+
int n = inorder.length;
43+
44+
for (int i = 0; i < n; ++i) {
45+
indexes.put(inorder[i], i);
46+
}
47+
48+
return build(inorder, postorder, 0, inorder.length - 1, 0, postorder.length - 1);
49+
}
50+
51+
private TreeNode build(int[] inorder, int[] postorder, int i1, int i2, int p1, int p2) {
52+
if (i1 > i2 || p1 > p2) {
53+
return null;
54+
}
55+
int rootVal = postorder[p2];
56+
int pos = indexes.get(rootVal);
57+
TreeNode root = new TreeNode(rootVal);
58+
59+
root.left = pos == i1 ? null : build(inorder, postorder, i1, pos - 1, p1, p1 - i1 + pos - 1);
60+
root.right = pos == i2 ? null : build(inorder, postorder, pos + 1, i2, p1 - i1 + pos, p2 - 1);
61+
62+
return root;
63+
}
64+
}
65+
66+
class TreeNode {
67+
int val;
68+
TreeNode left;
69+
TreeNode right;
70+
71+
TreeNode() {}
72+
TreeNode(int val) { this.val = val; }
73+
TreeNode(int val, TreeNode left, TreeNode right) {
74+
this.val = val;
75+
this.left = left;
76+
this.right = right;
77+
}
78+
}
79+

0 commit comments

Comments
 (0)