105. 从前序与中序遍历序列构造二叉树
给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
示例 1:
输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]
示例 2:
输入: preorder = [-1], inorder = [-1]
输出: [-1]
解题思路:本题是想将两个数组转换成一个二叉树,我们可以分别把前序遍历preorder 和 inorder的左右节点查分出来,右二叉树前序遍历可以知道根节点就是preorder第一个数,根据根节点可以在中序遍历里拆开根节点左右子树,根绝这个思路就可以将两个数组组成一个二叉树了,代码如下:
var buildTree = function(preorder, inorder) {
//如果前序遍历数组不存在就返回null
if(preorder.length == []) return null;
//记录中序遍历中根节点位置,中序比遍历中根节点之前是前序遍历的左节点,后面是右节点
let ops = 0;
while(inorder[ops] !== preorder[0]) ops ++;
//此时已经找到中序遍历中根节点位置,分别定义左右边节点前序遍历数组,和左边中序遍历数组,
let l_pre = [],l_in = [],r_pre = [],r_in = [];
for(let i = 0;i < ops; i ++){
//保存前序遍历左边节点,因为preorder是前序遍历,所有从第二位开始是左节点
l_pre.push(preorder[i+ 1]);
//中序遍历中ops之前是左边节点
l_in.push(inorder[i]);
}
for(let i = ops + 1; i < preorder.length; i ++){
//保存前序遍历右边节点
r_pre.push(preorder[i]);
//保存中序遍历右边节点
r_in.push(inorder[i]);
}
//创建一个二叉树,并赋值根节点
let root = new TreeNode(preorder[0]);
//通过递归创建左边子树
root.left = buildTree(l_pre,l_in);
//通过递归创建右边子树
root.right = buildTree(r_pre,r_in);
return root;
};