由二叉树的前序、中序遍历结果,重建二叉树
**前序遍历的第一个元素为根节点,在中序遍历中:根节点左右两侧即为左右子树的中序遍历结果。**
思路:
- 找到前序遍历的根节点在中序遍历中的位置
- 使用两个数组分别存储左子树的前序、中序遍历结果,递归构建左子树(中序结果为空--> 父节点为叶节点)
- 使用两个数组分别存储右子树的前序、中序遍历结果,递归构建右子树
- 将左右子树连接在当前根节点上
- JavaScript实现
function TreeNode(val) {
this.val = val;
this.left = null;
this.right = null;
}
function reConstructBinaryTree(pre, vin)
{
const len = vin.length;
if(!len) return null;//父节点为叶节点
let root = new TreeNode(pre[0]);//当前根节点
let target_idx = 0;
for(let i = 0; i < len; i++){
if(vin[i] == pre[0]){
target_idx = i;
break;
}
}
let cur_pre = [],
cur_vin = [];//左右子树的前中序遍历存储数组
for(let i = 1; i <= target_idx; i++){//左子树
cur_pre.push(pre[i]);//根节点之后加入与中序遍历等长的序列
cur_vin.push(vin[i - 1]);//根节点之前的全部加入
}
root.left = reConstructBinaryTree(cur_pre, cur_vin);
cur_pre.splice(0, cur_pre.length);
cur_vin.splice(0, cur_vin.length);
for(let i = target_idx + 1; i < len; i++){
cur_pre.push(pre[i]);
cur_vin.push(vin[i]);
}
root.right = reConstructBinaryTree(cur_pre, cur_vin);
return root;
}