题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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