Skip to content

Commit c8ea069

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

File tree

2 files changed

+98
-0
lines changed

2 files changed

+98
-0
lines changed

leetcode/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
- [x] [TreeTest__二叉树的所有路径](src/main/java/com/cpucode/binary/tree/paths/TreeTest.java)
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)
69+
- [ ] [TraversalTest__从前序与中序遍历序列构造二叉树](src/main/java/com/cpucode/binary/tree/preorder/inorder/TraversalTest.java)
6970

7071
------------------------
7172

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package com.cpucode.binary.tree.preorder.inorder;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
/**
7+
* 105. 从前序与中序遍历序列构造二叉树
8+
*
9+
* 题目描述
10+
* 根据一棵树的前序遍历与中序遍历构造二叉树。
11+
*
12+
* 注意:
13+
* 你可以假设树中没有重复的元素。
14+
*
15+
* 例如,给出
16+
* 前序遍历 preorder = [3,9,20,15,7]
17+
* 中序遍历 inorder = [9,3,15,20,7]
18+
*
19+
* 返回如下的二叉树:
20+
* 3
21+
* / \
22+
* 9 20
23+
* / \
24+
* 15 7
25+
*
26+
* 解法
27+
* 先遍历前序节点,对于前序的根节点,在中序节点 [i1, i2] 中找到根节点的位置 pos,
28+
* 就可以将中序节点分成:左子树 [i1, pos - 1]、右子树 [pos + 1, i2]。
29+
*
30+
* 通过左右子树的区间,可以计算出左、右子树节点的个数,假设为 m、n。
31+
* 然后在前序节点中,从根节点往后的 m 个节点为左子树,再往后的 n 个节点为右子树。
32+
*
33+
* 递归求解即可。
34+
*
35+
* 前序遍历:先遍历根节点,再遍历左右子树;
36+
* 中序遍历:先遍历左子树,再遍历根节点,最后遍历右子树。
37+
*
38+
* @author : cpucode
39+
* @date : 2021/5/17
40+
* @time : 19:16
41+
* @github : https://github.com/CPU-Code
42+
* @csdn : https://blog.csdn.net/qq_44226094
43+
*/
44+
public class TraversalTest {
45+
private Map<Integer, Integer> indexes = new HashMap<>();
46+
47+
public static void main(String[] args) {
48+
int[] preorder = {3,9,20,15,7};
49+
int[] inorder = {9,3,15,20,7};
50+
51+
TraversalTest traversalTest = new TraversalTest();
52+
TreeNode treeNode = traversalTest.buildTree(preorder, inorder);
53+
54+
System.out.println(treeNode.val);
55+
}
56+
57+
public TreeNode buildTree(int[] preorder, int[] inorder) {
58+
int n = inorder.length;
59+
60+
for (int i = 0; i < n; i++) {
61+
indexes.put(inorder[i], i);
62+
}
63+
64+
return build(preorder, inorder, 0, n - 1, 0, n - 1);
65+
}
66+
67+
private TreeNode build(int[] preorder, int[] inorder, int p1, int p2, int i1, int i2) {
68+
if (p1 > p2 || i1 > i2){
69+
return null;
70+
}
71+
72+
int rootVal = preorder[p1];
73+
int pos = indexes.get(rootVal);
74+
TreeNode treeNode = new TreeNode(rootVal);
75+
76+
// pos==i1,说明只有右子树,左子树为空
77+
treeNode.left = pos == i1 ? null : build(preorder, inorder, p1 + 1, pos - i1 + p1, i1, pos - 1);
78+
// pos==i2,说明只有左子树,右子树为空
79+
treeNode.right = pos == i2 ? null : build(preorder, inorder, pos - i1 + p1 + 1, p2, pos + 1, i2);
80+
81+
return treeNode;
82+
}
83+
}
84+
85+
class TreeNode {
86+
int val;
87+
TreeNode left;
88+
TreeNode right;
89+
90+
TreeNode() {}
91+
TreeNode(int val) { this.val = val; }
92+
TreeNode(int val, TreeNode left, TreeNode right) {
93+
this.val = val;
94+
this.left = left;
95+
this.right = right;
96+
}
97+
}

0 commit comments

Comments
 (0)