从前序与中序遍历序列构造二叉树
目录
1. 题目
2. 分析
关键是要画出这样的图片,脑子自己想大概率是写不出来的
2.1. 思路
- 找出根节点
- 前序遍历的第一个元素
- 递归构建左右子树,
- 这里注意要找出==递归函数的参数==
- 这些参数可以从两个数组里计算出来,如下图:
/**
* @param {number[]} preorder
* @param {number[]} inorder
* @return {TreeNode}
*/
let valToIndex = new Map();
var buildTree = function(preorder, inorder) {
for (let i = 0; i < inorder.length; i++) {
valToIndex.set(inorder[i], i);
}
return build(preorder, 0, preorder.length - 1,
inorder, 0, inorder.length - 1);
};
function build(preorder, preStart, preEnd,
inorder, inStart, inEnd) {
if (preStart > preEnd) {
return null;
}
// root 节点对应的值就是前序遍历数组的第一个元素
let rootVal = preorder[preStart];
// rootVal 在中序遍历数组中的索引
let index = valToIndex.get(rootVal);
let leftSize = index - inStart;
// 先构造出当前根节点
let root = new TreeNode(rootVal,null,null);
// 递归构造左右子树
root.left = build(preorder, preStart + 1, preStart + leftSize,
inorder, inStart, index - 1);
root.right = build(preorder, preStart + leftSize + 1, preEnd,
inorder, index + 1, inEnd);
return root;
}