剑指offer——— JZ4、重建二叉树

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

示例1

输入

[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]

返回值

{1,2,5,3,4,6,7}

解题思路

比如示例中,前序遍历第一个数字为1,那么1就是这个二叉树的根节点。根据根节点为1,可以把中序遍历分成”1左边,1,1右边“三个部分。

就变成了:pre:1 234567   vin:324 1 657

会发现中序中324又是一个中序遍历,对应的先序遍历是先序遍历中1后面的三个数字234

现在变成了对pre:234 vin:324的两个序列求二叉树。

解决这个问题可以使用递归实现

代码

首先先了解几个JavaScript的函数:

JavaScript slice() 方法:

slice() 方法可从已有的数组中返回选定的元素。

语法

arrayObject.slice(start,end)

参数

描述

start

必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。

end

可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。

返回值

返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。

说明

请注意,该方法并不会修改数组,而是返回一个子数组。如果想删除数组中的一段元素,应该使用方法 Array.splice()。

提示和注释

注释:您可使用负值从数组的尾部选取元素。

注释:如果 end 未被规定,那么 slice() 方法会选取从 start 到数组结尾的所有元素。

<script type="text/javascript">

var arr = new Array(3)
arr[0] = "George"
arr[1] = "John"
arr[2] = "Thomas"

document.write(arr + "<br />")
document.write(arr.slice(1) + "<br />")
document.write(arr)

</script>
输出:

George,John,Thomas
John,Thomas
George,John,Thomas
在本例中,我们将创建一个新数组,然后显示从其中选取的元素:

<script type="text/javascript">

var arr = new Array(6)
arr[0] = "George"
arr[1] = "John"
arr[2] = "Thomas"
arr[3] = "James"
arr[4] = "Adrew"
arr[5] = "Martin"

document.write(arr + "<br />")
document.write(arr.slice(2,4) + "<br />")
document.write(arr)

</script>
输出:

George,John,Thomas,James,Adrew,Martin
Thomas,James
George,John,Thomas,James,Adrew,Martin

JavaScript indexOf() 方法:

在本例中,我们将在 "Hello world!" 字符串内进行不同的检索:

<script type="text/javascript">

var str="Hello world!"
document.write(str.indexOf("Hello") + "<br />")
document.write(str.indexOf("World") + "<br />")
document.write(str.indexOf("world"))

</script>
以上代码的输出:

0
-1
6

答案

function reConstructBinaryTree(pre, vin )
    {
        if(pre.length==0){
            return null;
        }
        let head=new TreeNode(pre[0]);
        let headindex=vin.indexOf(pre[0]);
        let vinleft=vin.slice(0,headindex);
        let vinright=vin.slice(headindex+1);
        let preleft=pre.slice(1,headindex+1);
        let preright=pre.slice(headindex+1);
        if(vinleft.length!=0){
            head.left=reConstructBinaryTree(preleft, vinleft);
        }
        if(vinright.length!=0){
            head.right=reConstructBinaryTree(preright,vinright);
        }
        return head;
    }

运行环境:JavaScript (V8 6.0.0)

运行时间:21ms

占用内存:6592KB

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值