题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
知识点不难,先根中根创建数。主要就是对两个数组进行划分 找的左右子树。文中
p1是先序的左子树 p2是先序的又子树
v1是中序的左子树 v2是中序的右子树
综上:这道题就可以理解为怎么把这两个数组的左右子树都找出来。这个百度都能百度到,写这道题的时候为了简单,并没有考虑内存的问题,结果内存使用率8000k+,也能过~~
js中有一个Array.slice(start,end)函数,可以进行数组的截取。这就省去很多事(也是内存使用这么高的原因,它每次偶读返回一个新的数组)。
/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
function reConstructBinaryTree(pre, vin)
{
// write code here
var tree = new TreeNode(pre[0])
//数组
let p1 = [],
p2 = [],
v1 = [],
v2 = [];
let obj = assist(p1, p2, v1, v2, pre, vin)
p1 = obj.p1
p2 = obj.p2
v1 = obj.v1
v2 = obj.v2
tree.left = def(p1, v1, new TreeNode())
tree.right = def(p2, v2, new TreeNode())
//变量
def(pre,vin,tree)
return tree
}
function def(pre,vin,node){
if(pre.length == 0) {
return null
}
let p1 = [],
p2 = [],
v1 = [],
v2 = [];
let obj = assist(p1, p2, v1, v2, pre, vin)
p1 = obj.p1
p2 = obj.p2
v1 = obj.v1
v2 = obj.v2
if(p1.length > 0) {
node.left = def(p1, v1, new TreeNode())
}
if(p2.length > 0) {
node.right = def(p2, v2, new TreeNode())
}
node.val = pre[0]
return node
}
//辅助函数:将两个数组变成四个数组
function assist(p1,p2,v1,v2,pre,vin){
let a1,a2,b1,b2
a1 = 0; b2 = vin.length
if(pre.length == 0) {
return {p1 : [], p2: [], v1 : [], v2 : []}
} else {
let vinIndex = vin.indexOf(pre[0])
p1 = pre.slice(1,vinIndex+1)
p2 = pre.slice(vinIndex+1,pre.length)
v1 = vin.slice(0,vinIndex )
v2 = vin.slice(vinIndex +1,vin.length)
//多说一句 pre.length 和vin.length 是一样的
}
return {
p1 : p1,
p2 : p2,
v1 : v1,
v2 : v2
}
}
为什么要使用辅助函数:这种找树的问题其实都一个套路,如果换成先序+后序 或者 后序+中序 来创建树,那么只要修改辅助函数即可。代码效率不高,但是看着简单一点。