leetcode每日一题(2020-05-22):105. 从前序与中序遍历序列构造二叉树

Posted autumn-starrysky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode每日一题(2020-05-22):105. 从前序与中序遍历序列构造二叉树相关的知识,希望对你有一定的参考价值。

题目描述:根据一棵树的前序遍历与中序遍历构造二叉树。假设树中没有重复的元素。
技术图片

今日学习:
1.复习二叉树遍历
2.复习map
3.搭建mediasoup-demo(websocket连接失败,原因没找到)
4.脚手架是为了减少因为想要减少重复工作而进行的重复工作

天使爆破组果然是小天使,题解一我想出来了,后续题解没有想到
题解1:

var buildTree = function(preorder, inorder) {
    if(!preorder.length) return null
    const node = new TreeNode(preorder[0])
    const index = inorder.indexOf(preorder[0])
    const inLeft = inorder.slice(0, index)
    const inRight = inorder.slice(index + 1)
    const preLeft = preorder.slice(1, index + 1)
    const preRight = preorder.slice(index + 1)
    node.left = buildTree(preLeft, inLeft)
    node.right = buildTree(preRight, inRight)
    return node
};

题解2:

//不用slice改用指针
var buildTree = (preorder, inorder) => {
  return helper(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1)
}

function helper(preorder, p_start, p_end, inorder, i_start, i_end) {
  if (p_start > p_end) return null // preorder为空
  let rootVal = preorder[p_start] // 根节点的值
  let root = new TreeNode(rootVal) // 根节点
  let mid = inorder.indexOf(rootVal) // 根节点在inorder的位置
  let leftNum = mid - i_start // 左子树的节点数

  root.left = helper(preorder, p_start + 1, p_start + leftNum, inorder, i_start, mid - 1)
  root.right = helper(preorder, p_start + leftNum + 1, p_end, inorder, mid + 1, i_end)
  return root
}

题解3:

//hashmap版
var buildTree = (preorder, 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, p_start, p_end, inorder, i_start, i_end, map) {
  if (p_start > p_end) return null // preorder为空
  let rootVal = preorder[p_start] // 根节点的值
  let root = new TreeNode(rootVal) // 根节点
  let mid = map.get(rootVal) // 根节点在inorder的位置
  let leftNum = mid - i_start // 左子树的节点数

  root.left = helper(preorder, p_start + 1, p_start + leftNum, inorder, i_start, mid - 1, map)
  root.right = helper(preorder, p_start + leftNum + 1, p_end, inorder, mid + 1, i_end, map)
  return root
}






以上是关于leetcode每日一题(2020-05-22):105. 从前序与中序遍历序列构造二叉树的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode每日一题(3)

LeetCode每日一题

LeetCode2022 7月 每日一题

LeetCode2022 7月 每日一题

LeetCode9月 每日一题

LeetCode9月 每日一题