# 题目描述
给定两个整数数组 preorder
和 inorder
,其中 preorder
是二叉树的先序遍历, inorder
是同一棵树的中序遍历,请构造二叉树并返回其根节点
# 测试用例
- 输入:
preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
- 输出:
[3,9,20,null,null,15,7]
# 思路
参考代码中的注释
# 代码实现
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {number[]} preorder
* @param {number[]} inorder
* @return {TreeNode}
*/
var buildTree = function(preorder, inorder) {
// 我们要取preorder的第一个元素,所以要先判断如果preorder为空了,则返回null
if(preorder.length == 0){
return null;
}
// 取preorder的第一个元素
let preCur = preorder[0];
let root = new TreeNode(preCur);
// 准备开始分割inorder, 所以要先判断inorder的长度,
// 如果只剩一个元素, 就直接把分割点对应的元素返回
if(inorder.length == 1){
return root;
}
// 分割点是root在inorder中的位置
let index = inorder.indexOf(preCur);
// 开始分割inorder
let leftInorder = inorder.slice(0, index);
let rightInorder = inorder.slice(index + 1, inorder.length);
// 分割preorder, 不要第一个切割元素了
let leftPreorder = preorder.slice(1, 1 + leftInorder.length);
let rightPreorder = preorder.slice(1 + leftInorder.length, preorder.length);
// 递归
root.left = buildTree(leftPreorder, leftInorder);
root.right = buildTree(rightPreorder, rightInorder);
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
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