【路飞】105. 从前序与中序遍历序列构造二叉树

99 阅读2分钟

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;
};