前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >关于js的二叉树

关于js的二叉树

作者头像
epoos
发布于 2022-06-06 08:10:09
发布于 2022-06-06 08:10:09
80400
代码可运行
举报
文章被收录于专栏:epoos.comepoos.com
运行总次数:0
代码可运行

1.将二叉树的顺序存储数组转换为链表结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 输入
var arr = [3, 9, 20, null, null, 15, 7]

/**
 * 仅适用于完全二叉树
 */
function toBeLink1(arr, x, obj) {
  obj = obj || {}
  x = x || 0
  obj.value = arr[x]
  var lIndex = 2 * x + 1 // 左侧子节点序是父节点序列的2倍(下标从0开始,所以未 2*x + 1)
  var rIndex = 2 * x + 2 // 右侧子节点序是父节点序列的2倍+1(下标从0开始,所以未 2*x + 2)
  if (arr[lIndex] === 0 || arr[lIndex]) {
    toBeLink(arr, lIndex, obj.left = {})
  }
  if (arr[rIndex] === 0 || arr[rIndex]) {
    toBeLink(arr, rIndex, obj.right = {})
  }
  return obj
}

/**
* 适用所有二叉树 - 方法1
*/
class TreeNode {
  constructor(value) {
    this.value = value
  }
  insert(values) {
    if (!values.length) return this
    const queue = [this]
    let i = 0
    while (queue.length > 0) {
      const current = queue.shift()
      for (let side of ['left', 'right']) {
        if (!current[side]) {
          if (values[i] !== null) {
            current[side] = new TreeNode(values[i])
          }
          i++
          if (i >= values.length) return this
        }
        if (current[side]) queue.push(current[side])
      }
    }
    return this
  }
}

function toBeLink(arr) {
  if (arr.length === 0) return {}
  const myTree = new TreeNode(arr[0])
  myTree.insert(arr.slice(1))
  return myTree
}

/**
* 适用所有二叉树 - 方法2
*/
function toBeLink(arr, obj = {}, queue = []) {
  if (!arr || arr[0] === null || arr[0] === '' || arr[0] === undefined) return obj
  // 根节点初始化
  obj.value = arr[0]
  queue.push(obj)

  let i = 1
  while(i <= arr.length) {
    const current = queue.shift()
    for (let side of ['left', 'right']) {
      const arri = arr[i]
      i++
      console.log(i, arr.length)
      if (i > arr.length) return obj
      if (arri === null) continue

      current[side] = { value: arri }
      if (arri !== undefined) {
        queue.push(current[side])
      }
    }
  }
}
/**
* 适用所有二叉树 - 方法2 - 纯 es5 版本
*/
function toBeLink(arr) {
  if (arr.length === 0 || arr[0] === null) return {}
  var obj = { value: arr[0] }
  var queue = [obj]
  var i = 1
  var sideArr = ['left', 'right']
  while (i <= arr.length) {
    var current = queue.shift()
    for (var j = 0; j < sideArr.length; j++) {
      var arri = arr[i]
      var side = sideArr[j]
      i++
      if (i > arr.length) return obj
      if (arri === null) continue

      current[side] = { value: arri }
      queue.push(current[side])
    }
  }
}

// 输出
var root = {
  value: 3,
  left: {
    value: 9,
  },
  right: {
    value: 20,
    left: {
      value: 15,
    },
    right: {
      value: 7,
    }
  }
}

2.给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 示例:给定二叉树 [3,9,20,null,null,15,7] 最大深度是 3

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var maxDepth = function(root) {
  if(!root) return 0 
  return 1 + Math.max(maxDepth(root.left), maxDepth(root.right))
}
var root = toBeLink(arr)
maxDepth(root) // 3

5.返回二叉树前序遍历(根左右)、中序遍历(左跟右)、后序遍历(左右跟)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, null, 2, 3] // return [1, 2, 3]
var root = toBeLink(arr)

/**
 * 前序遍历
 */
function getTreeLeft(root, stack = []) {
  if (root.value === undefined) return stack
  stack.push(root.value)
  getTreeLeft(root.left, stack)
  getTreeLeft(root.right, stack)
  return stack
}

/**
 * 中序遍历
 */
function getTreeCenter(root, stack = []) {
  if (root.value === undefined) return stack
  getTreeCenter(root.left, stack)
  stack.push(root.value)
  getTreeCenter(root.right, stack)
  return stack
}

/**
 * 后序遍历
 */
function getTreeRight(root, stack = []) {
  if (root.value === undefined) return stack
  getTreeRight(root.right, stack)
  stack.push(root.value)
  getTreeRight(root.left, stack)
  return stack
}

getTreeLeft(root)

3.获取二叉树的所有叶子节点的路径

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function findAllPath(root) {
  var paths = []
  var genPath = (root, path) => {
    if (!root.value) return path

    path += '>' + root.value
    if (root.left === undefined && root.right === undefined) {
      paths.push(path)
    } else {
      genPath(root.left, path)
      genPath(root.right, path)
    }
  }
  genPath(root, '')
  return paths
}

4.找到路径和为 target 的二叉树路径

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function findAllPath(root, target) {
  let paths = []
  let genPath = (root, path) => {
    path = Object.assign({}, path)
    path.str = path.str ? path.str + '->' + root.value : root.value
    path.sum = path.sum ? path.sum + root.value : root.value

    if (path.sum === target) {
      console.log('target path is ', path)
    }
    if (root.left === undefined && root.right === undefined) {
      return paths.push(path)
    }
    if (root.left !== undefined) {
      genPath(root.left, path)
    }
    if (root.right !== undefined) {
      genPath(root.right, path)
    }
  }
  genPath(root, {})
  return paths
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
二叉树常见面试题
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
河马嘴不大
2022/12/24
2100
前端leetcde算法面试套路之二叉树
这里优先选择了 LeetCode 热题 HOT 100 中的树题,毕竟刷题的边际收益就是冲击需要算法的面试,所以 Hot 优先级更高。
js2030code
2022/11/10
2580
用Js怒刷LeetCode
针对有一定数据结构基础(了解链表, 二叉树, 二叉堆, 递归)的基本概念,并对时间空间复杂度有基本认知的。
hellocoder2028
2022/10/27
2.2K0
面试二叉树看这 11 个就够了~
不知道你有没有这种困惑,虽然刷了很多算法题,当我去面试的时候,面试官让你手写一个算法,可能你对此算法很熟悉,知道实现思路,但是总是不知道该在什么地方写,而且很多边界条件想不全面,一紧张,代码写的乱七八糟。如果遇到没有做过的算法题,思路也不知道从何寻找,那么这篇文章就主要为你解决这几个问题。
Lenis
2019/12/25
6840
面试二叉树看这 11 个就够了~
二叉树实战 22 题,速度收藏吧!
深刻的理解这些题的解法思路,在面试中的二叉树题目就应该没有什么问题,甚至可以怒他,哈哈。
Java技术栈
2018/12/11
4990
【leetcode系列】104. 二叉树的最大深度
https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/description/
lucifer210
2019/08/16
4770
js二叉树层序遍历
博主最近在刷leetcode,做到二叉树套题的时候发现很多题的解题思路都是基于二叉树的层序遍历来完成的,因此写下这篇文章,记录一下二叉树层序遍历这件"神器"在实战的运用。
hellocoder2028
2022/12/15
6400
前端leetcde算法面试套路之树
在前端中确实用到不少与树相关的的知识,比方说 DOM 树,Diff 算法,包括原型链其实都算是树,学会树,其实对于学这些知识还是有比较大的帮助的,当然我们学算法还是得考虑面试,而树恰好也是一个大重点 -- 起码在前端而言;
js2030code
2022/11/10
3390
LeetCode 二叉树系统题解
TIPS:前中后序遍历区别在于三字中的中间那个字,前、中、后序分别对应左、根、右。
Yano_nankai
2019/11/10
9680
LeetCode 二叉树系统题解
【数据结构与算法】一起搞定面试中的二叉树题目(二)
作者:IOExceptioner 本文继续一起搞定面试中的二叉树(一)一文总结二叉树相关的面试题。 12. 二叉树的前序遍历 迭代解法 ArrayList<Integer> preOrder(TreeNode root){ Stack<TreeNode> stack = new Stack<TreeNode>(); ArrayList<Integer> list = new ArrayList<Integer>(); if(root == null){ return l
用户1634449
2018/10/18
5490
【剑指offer】5.二叉树的镜像和打印
导读: 分类:技术干货 题目:二叉树的遍历和重建 一起重温《剑指offer》,再也不怕手写算法啦! 二叉树简介 基本结构: function TreeNode(x) { this.val = x; this.left = null; this.right = null; } 二叉树的前序、中序、后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树; 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树; 后序遍历:对任一子树,先遍历其左子
ConardLi
2019/09/08
3920
Js算法与数据结构拾萃(4):二叉树
因此只要答对这道题,你就可以超越世界级大牛,问鼎码林之巅(逃) 导读: •二叉树知识重点•二叉树深度不一,因此天生适用递归,因此可用递归处理•判断两树相等•翻转二叉树•二叉树三种深度遍历(迭代)•前序遍历•中序遍历•后序遍历•二叉树的一些迭代特性•判断是否二叉搜索树•二叉搜索树的最近公共祖先•二叉树的最近公共祖先
一粒小麦
2020/02/25
6420
翻转二叉树
谷歌:我们90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了。
_kyle
2020/12/12
2590
LeetCode通关:连刷三十九道二叉树,刷疯了!
大家好,我是拿输出博客来督促自己刷题的老三,这一节我们来刷二叉树,二叉树相关题目在面试里非常高频,而且在力扣里数量很多,足足有几百道,不要慌,我们一步步来。我的文章很长,你们 收藏一下。
三分恶
2021/09/08
8470
JavaScript算法题总结 (三)二叉树
BM23 二叉树的前序遍历 /* * function TreeNode(x) { * this.val = x; * this.left = null; * this.right = null; * } */ /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param root TreeNode类 * @return int整型一维数组 */ function preorderTraversal( root )
henu_Newxc03
2022/05/12
2490
JavaScript算法题总结 (三)二叉树
简单介绍二叉树
一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。
用户10788736
2023/10/16
2050
简单介绍二叉树
面试必备:高频算法题汇总「图文解析 + 教学视频 + 范例代码」必问之 排序 + 二叉树 部分!
所谓排序算法,即通过特定的算法因式将一组或多组数据按照既定模式进行重新排序。这种新序列遵循着一定的规则,体现出一定的规律,因此,经处理后的数据便于筛选和计算,大大提高了计算效率。
圆号本昊
2021/09/24
3570
面试必备:高频算法题汇总「图文解析 + 教学视频 + 范例代码」必问之 排序 + 二叉树 部分!
144. 二叉树的前序遍历
先使用递归来求解。前序遍历的顺序是根左右,因此先将当前节点的值放入结果数组中,然后再递归的求出左节点和右节点即可。
chuckQu
2022/08/19
1700
二叉树——257. 二叉树的所有路径
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
向着百万年薪努力的小赵
2022/12/02
3390
二叉树——257. 二叉树的所有路径
「中高级前端」窥探数据结构的世界- ES6版
数据结构是在计算机中组织和存储数据的一种特殊方式,使得数据可以高效地被访问和修改。更确切地说,数据结构是数据值的集合,表示数据之间的关系,也包括了作用在数据上的函数或操作。
coder_koala
2019/08/15
8670
相关推荐
二叉树常见面试题
更多 >
LV.1
某大厂前端开发工程师
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验