JavaScript / TypeScript for LeetCode (125)

是差点运气,可我一直在努力!

当前进程:

  • 开始时间:2020.6.27
  • 结束时间:undefined

GitHub仓库:https://github.com/Cundefined/JavaScript-or-TypeScript-for-LeetCode

1、题目要求

( LeetCode-第105题 ) 从前序与中序遍历序列构造二叉树

2、解题思路

方法:递归

注意:
前序遍历 -> [ 根节点, [左子树的前序遍历结果], [右子树的前序遍历结果] ]
中序遍历 -> [ [左子树的中序遍历结果], 根节点, [右子树的中序遍历结果] ]

2.1、JavaScript Solution

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {number[]} preorder
 * @param {number[]} inorder
 * @return {TreeNode}
 */
var buildTree = function (preorder, inorder) {
  // map记录中序遍历元素和位置的对应关系,快速定位根节点
  //省得每次递归调用都去遍历inorder数组,这样只遍历一次就行
  let map = new Map();
  for (let i = 0; i < inorder.length; i++) {
    map.set(inorder[i], i);
  }
  return helper(
    preorder,
    0,
    preorder.length - 1,
    inorder,
    0,
    inorder.length - 1,
    map
  );
};

function helper(preorder, preStart, preEnd, inorder, inStart, inEnd, map) {
  // 递归结束条件
  if (preStart > preEnd || inStart > inEnd) {
    return null;
  }

  //在前序遍历结果数组中找到当前根节点
  let root = new TreeNode(preorder[preStart]);
  //找到当前根节点在中序遍历结果数组中的位置,以此计算得到左、右子树长度
  let rootPos = map.get(preorder[preStart]);
  //计算左子树长度
  let leftSubTreeLength = rootPos - inStart;

  // 构建左子树
  // 左子树的前序遍历:preStart+1 到 preStart+leftSubTreeLength
  // 左子树的中序遍历:inStart 到 rootPos-1
  root.left = helper(
    preorder,
    preStart + 1,
    preStart + leftSubTreeLength,
    inorder,
    inStart,
    rootPos - 1,
    map
  );

  // 构建右子树
  // 右子树的前序遍历:preStart+1 到 preStart+leftSubTreeLength
  // 右子树的中序遍历:inStart 到 rootPos-1
  root.right = helper(
    preorder,
    preStart + leftSubTreeLength + 1,
    preEnd,
    inorder,
    rootPos + 1,
    inEnd,
    map
  );

  return root;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值