zoukankan      html  css  js  c++  java
  • 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
    }
    
  • 相关阅读:
    前端学习资源
    CSS样式属性单词之Left
    CSS 解决 a标签去掉下划线 text-decoration: none无效 的解决方案
    CSS二级菜单
    position属性absolute与relative 详解
    CSS行高——line-height
    VS code注释快捷键
    CSS padding margin border属性详解
    block(块级元素)和 inline(内联元素) 的区别
    css(float浮动和clear清除)
  • 原文地址:https://www.cnblogs.com/autumn-starrysky/p/12939573.html
Copyright © 2011-2022 走看看