【算法】二叉树

news2025/1/16 2:43:23

❤️ Author: 老九
☕️ 个人博客:老九的CSDN博客
🙏 个人名言:不可控之事 乐观面对
😍 系列专栏:

文章目录

  • 二叉树
    • 数组转化为二叉树
    • 二叉树转化为二叉链表
  • 二叉树的遍历
  • 排序二叉树BST(二叉搜索树)

二叉树

  • 当一颗二叉树有n个结点时,就会有n-1个线条
  • 完全二叉树:除最后一层的右不满以外,其他层都是满的
  • 如果一个完全二叉树的结点从上到下,从左到右从0开始编号,一个结点和两个子结点的编号为,n,2n+1,2n+2,一个结点父结点是:Math.floor((m-1)/2)
  {
    val : 3,
    left : {
      val : 1,
      left : null,
      right : null,
    },
    right : {
      val : 5,
      left : null,
      right : null
    }
  }

数组转化为二叉树

<script>
  //将存储于array中的根节 点在rootPos位置的二叉树转换为二叉链表形式
  function arrayToTree(array, rootPos = 0) {
    if (array[rootPos] === null) {
      return null
    }
    var root = {
      var: array[rootPos],
      left: null,
      right: null,
    }
    root.left = arrayToTree(array, rootPos * 2 + 1)
    root.right = arrayToTree(array, rootPos * 2 + 2)

    return root
  }
</script>
  • 但是上面的做法会有null,比较占用空间
<script>
  function condensedArrayToTree(ary) {
    if (ary.length == 0) {
      return null
    }
    var root = {
      val: ary[0],
      left: null,
      right: null,
    }
    var nodes = [root]
    for (var i = 1; i < ary.length; i++) {
      var currNode = nodes.shift()
      if (ary[i] != null) {
        var node = {
          val: ary[i],
          left: null,
          right: null
        }
        currNode.left = node
        nodes.push(node)
      }
      i++
      if (ary[i] != null) {
        var node = {
          val: ary[i],
          left: null,
          right: null
        }
        currNode.right = node
        nodes.push(node)
      }
    }
    return root
  }
  condensedArrayToTree([1,null,2,3,null,null,4,null,5])
</script>

二叉树转化为二叉链表

<script>
  function treeToArray(root, pos = 0, result = []) {
    if (root == null) {
      return
    }
    result[pos] = root.val

    treeToArray(root.left, pos * 2 + 1, result)
    treeToArray(root.right, pos * 2 + 2, result)

    return result
  }
</script>
  • 加强版树转数组
<script>
  function treeToCondensedArray(root){
    var ary = []
    if(!root){
      return ary
    }
    var nodes = [root]
    while(nodes.length){
      var node = nodes.shift()
      if(node){
        ary.push(node.val)
        nodes.push(node.left)
        nodes.push(node.right)
      }else{
        ary.push(node)
      }
    }
    return ary
  }
</script>

二叉树的遍历

  • 按层遍历:从上到下,从左到右遍历每一层的结点
  • 先序遍历,先遍历根节点,再遍历左子树,最后遍历右子树,对子树的遍历依然遵循此规则
  • 还有中序遍历,后序遍历
  • 先序遍历画轮廓,10628439578在这里插入图片描述
  • 中序遍历也是画轮廓,先把叶子节点补上,然后数第二次碰到的结点,26804195378
    在这里插入图片描述
  • 后序遍历是第三次碰到每个结点的时候计数,画法和中序遍历画法一样,28640598731
<script>

  function preOrderTraverse(root) {
    if (root) {
      console.log(root.val)
      preOrderTraverse(root.left)
      preOrderTraverse(root.right)
    }
  }
  function inOrderTraverse(root){
    if(root){
      inOrderTraverse(root.left)
      console.log(root.val)
      inOrderTraverse(root.right)
    }
  }
  function postOrderTraverse(root){
    if(root){
      postOrderTraverse(root.left)
      postOrderTraverse(root.right)
      console.log(root.val)
    }
  }
  condensedArrayToTree([1,0,3,6,4,9,7,2,8,,,,5,,8])
  //高级版本
  function preOrderTraverseH(root, action) {
    if (root) {
      action(root.val)
      preOrderTraverse(root.left, action)
      preOrderTraverse(root.right, action)
    }
  }

  </script>

排序二叉树BST(二叉搜索树)

  • 一颗二叉树中的每个结点左子树中的结点都比它根节点小,每个结点的右子树中的结点比它根节点大或等于
  • 排序二叉树的中序遍历结果是有序的
  • 时间复杂度最差是n的平方,平均情况是n*logn
  • 空间复杂度是构建出来的二叉树占用的空间,为n
<script>
  //通过val构建一个结点,并将结点插入到排序二叉树bst中的正确位置上,返回处理完成后的树的根节点
  function insertIntoBST(bst, val) {
    let node = {
      val: val,
      left: null,
      right: null
    }
    if (!bst) {
      return node
    }
    if (val < bst.val) {
      bst.left = insertIntoBST(bst.left, val)
    } else {
      bst.right = insertIntoBST(bst.right, val)
    }
    return bst
  }
  function inOrderTraverse(root, action) {
    if (root) {
      inOrderTraverse(root.left, action)
      action(root.val)
      inOrderTraverse(root.right, action)
    }
  }
  //利用二叉树来排序
  //构建一颗空的排序二叉树,将数组ary中的元素都插入这颗二叉树
  //完成后,中序遍历二叉树即可得到有序结果
  function bstSort(ary) {
    // var tree = null
    // for (var i = 0; i < ary.length; i++) {
    //   tree = insertIntoBST(tree, ary[i])
    // }
    var tree = ary.reduce((tree,it) => {
      return insertIntoBST(tree,it)
    },null)
    i = 0
    inOrderTraverse(tree, val => {
      ary[i] = val
      i++
    })
    return ary
  }
</script>


————————————————————————
♥♥♥码字不易,大家的支持就是我坚持下去的动力♥♥♥
版权声明:本文为CSDN博主「亚太地区百大最帅面孔第101名」的原创文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/166131.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新思路dp

参考文章思路&#xff1a;点我 题&#xff1a;C. Count Binary Strings 前言&#xff1a;嗯,今天做这个题的时候&#xff0c;想了一堆乱七八糟的解法&#xff0c;想记录一下hhhhhh。 题意&#xff1a;输入以类似于邻接表的形式给出字符串&#xff08;只由000和111组成&#…

深入理解MySQL中的bin log、redo log、undo log

bin log&#xff08;二进制日志&#xff09; 什么是bin log&#xff1f; 记录数据库执行的写入性操作信息&#xff0c;以二进制的形式保存在磁盘中。 由服务层产生&#xff0c;所有储存引擎都支持。 bin log属于逻辑日志。 bin log日志有三种格式&#xff1a;STATMENT、ROW、M…

详解数据库的锁机制及原理

详解数据库的锁机制及原理1.数据库锁的分类2.行锁共享锁排他锁更新锁3.意向锁4.锁机制解释数据库隔离级别1.数据库锁的分类 本图源自CSDN博主&#xff1a;Stephen.W 数据库锁一般可以分为两类&#xff0c;一个是悲观锁&#xff0c;一个是乐观锁 乐观锁一般是指用户自己实现的…

Java 中是如何获取 IP 属地的

细心的小伙伴可能会发现&#xff0c;抖音新上线了 IP 属地的功能&#xff0c;小伙伴在发表动态、发表评论以及聊天的时候&#xff0c;都会显示自己的 IP 属地信息下面&#xff0c;我就来讲讲&#xff0c;Java 中是如何获取 IP 属地的&#xff0c;主要分为以下几步 通过 HttpSer…

HuggingFace (transformers) 自定义图像数据集、使用 DeiT 模型、Trainer 进行训练回归任务

资料 Hugging Face 官方文档&#xff1a;https://huggingface.co/ Hugging Face 代码链接&#xff1a;https://github.com/huggingface/transformers 1. 环境准备 创建 conda 环境激活 conda 环境下载 transformers 依赖下载 transformers 中需要处理数据集的依赖下载 pytor…

win10录屏文件在哪?如何找到录制后的文件

在工作和学习中&#xff0c;我们会遇到需要使用录屏工具录制电脑屏幕的情况&#xff0c;很多小伙伴在录制完win10电脑屏幕之后&#xff0c;找不到录制的视频文件。win10录屏文件在哪&#xff1f;今天小编教大家如何找到电脑录屏文件和录制win10电脑屏幕的方法&#xff0c;如果您…

带你认识QOwnNotes

导读QOwnNotes 是一款自由而开源的笔记记录和待办事项的应用&#xff0c;可以运行在 Linux、Windows 和 mac 上。这款程序将你的笔记保存为纯文本文件&#xff0c;它支持 Markdown 支持&#xff0c;并与 ownCloud 云服务紧密集成。 QOwnNotes 的亮点就是它集成了 ownCloud 云服…

数据量大也不卡的bi软件有哪些?

用过数据分析软件的都知道&#xff0c;很多的软件在数据量不算特别大的时候还好&#xff0c;分析效率、响应速度都不慢&#xff0c;但一旦使用的数据量超过一定范围&#xff0c;系统就会明显变慢&#xff0c;甚至崩溃。随着企业业务的发展扩张&#xff0c;数据分析的精细化&…

Linksys WRT路由器刷入OpenWrt与原厂固件双固件及切换

Linksys路由器OpenWrt与原厂固件双固件刷入及切换双固件机制使用原厂固件刷其他固件使用原厂固件切换启动分区使用OpenWrt刷入Sysupgrade使用OpenWrt刷入Img使用OpenWrt切换分区通用的硬切换分区&#xff08;三次重启&#xff09;双固件机制 新机器默认有一个原厂固件&#xf…

详解分布式系统核心概念——CAP、CP和AP

最近研究Sykwalking&#xff0c;当调研 oap如何进行集群部署时发现&#xff1a;skywalking oap 之间本身不能搭建集群&#xff0c;需要一个集群管理器来组建集群&#xff0c;它支持nacos、zookeeper、Kubernetes、Consul、Etcd 五种集群管理器。我重点比较了nacos和zookeeper&a…

python中的闭包和装饰器

目录 一.闭包 1.闭包的用途和用法 简单闭包 2.nonlocal关键字的作用 ATM闭包实现 注意事项 小结 二.装饰器 装饰器的一般写法&#xff08;闭包写法&#xff09; 装饰器的语法糖写法 一.闭包 1.闭包的用途和用法 先看如下代码&#xff1a; 通过全局变量account_amount来…

【Python学习】条件和循环

前言 往期文章 【Python学习】列表和元组 【Python学习】字典和集合 条件控制 简单来说&#xff1a;当判断的条件为真时&#xff0c;执行某种代码逻辑&#xff0c;这就是条件控制。 那么在讲条件控制之前&#xff0c;可以给大家讲一个程序员当中流传的比较真实的一个例子…

CUDA规约算法(加和)

1.block内相邻元素规约&#xff08;线程不连续&#xff09; 上图为1个block内的16个线程的操作示意&#xff1a; 第0个线程会和第1&#xff0c;2&#xff0c;4&#xff0c;8发生关系 第2个线程会和第3个线程发生关系 第4个线程会和第5&#xff0c;6个线程发生关系 ... 以上…

这7个网络设备配置接口基本参数要牢记,从此接口相关配置不用怕!

本文给大家介绍网络设备配置接口基本参数&#xff0c;包括接口描述信息、接口流量统计时间间隔功能以及开启或关闭接口。 进入接口视图 背景信息 对接口进行基本配置前&#xff0c;需要进入接口视图。 操作步骤 执行命令system-view&#xff0c;进入系统视图。执行命令inte…

Widget小组件

目录 技能点 Widget背调 a. 设计定位 b. Widget小组件限制 c. Widget小组件 开发须知 d. 什么是 SwiftUI App Group 数据共享 a. 配置 App Groups 1、开发者账号配置&#xff0c;并更新pp证书 2、Xcode配置 b. 缓存数据共享-代码实现 1、文件存储 2. 沙盒存储&…

【MySQL】运算符及相关函数详解

序号系列文章3【MySQL】MySQL基本数据类型4【MySQL】MySQL表的七大约束5【MySQL】字符集与校对集详解6【MySQL】MySQL单表操作详解文章目录前言MySQL运算符1&#xff0c;算术运算符1.1&#xff0c;算术运算符的基本使用1.2&#xff0c;常用数学函数的基本使用2&#xff0c;比较…

vulnhub DC系列 DC-7

总结&#xff1a;社工尝试 目录 下载地址 漏洞分析 信息收集 ssh webshell 命令执行 提权 下载地址 DC-7.zip (Size: 939 MB)Download: http://www.five86.com/downloads/DC-7.zipDownload (Mirror): https://download.vulnhub.com/dc/DC-7.zip漏洞分析 信息收集 这里还…

代码随想录算法训练营第13天 239.滑动窗口最大值、347. 前 K 个高频元素

代码随想录算法训练营第13天 239.滑动窗口最大值、347. 前 K 个高频元素 滑动窗口最大值 力扣题目链接(opens new window) 给定一个数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只…

YonBuilder 应用构建教程之移动端扩展

YonBuilder 移动端扩展 在上一篇文章中&#xff0c;我们通过对员工信息实体的移动端页面构建来对 YonBuilder 移动端配置的基础流程进行了简单的介绍&#xff0c;本篇文章则通过之前搭建的出入库实体来进行扩展&#xff0c;主要介绍如何在移动端中添加跳转页面的功能以及通过函…

大连理工大学(开发区校区)2023年新生赛(验题人题解)

难度分布 根据排行榜情况&#xff0c;大致分布如下&#xff1a; Easy&#xff1a;AIDE Middle&#xff1a;CJF Hard&#xff1a;GBH 题解 A. Hello World.&#xff08;题意实现&#xff09; 直接输出Hello world. I. lgl想签到&#xff08;题意实现&#xff09; 统计周…