04重建二叉树

题目描述

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

为什么要使用辅助函数:这种找树的问题其实都一个套路,如果换成先序+后序 或者 后序+中序 来创建树,那么只要修改辅助函数即可。代码效率不高,但是看着简单一点。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值