二叉树——初识

2023-11-17

链表 ——> 二叉树 ——> 二叉查找树 ——>  平衡二叉树

二叉树时间复杂度:O(logn) ,即2^x(树的深度)=N

如:21亿点需要查找几次:2^32 = 21亿,查找32次。

1、满二叉树

2、完全二叉树:设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边。(除最后一层外,为一颗满二叉树)

   完全二叉树的基础上可以引申出 堆(heap) 的数据结构:

    堆的定义:堆就是一个数组,用来存放完全二叉树。

         大堆:所有 根节点值 均大于 左右孩子节点值

         小堆:所有 根节点值  均小于 左右孩子节点值

       如何理解数组存放完全二叉树?堆排序:

      arr = [3, 1, 4, 2, 5]  arr[0] 为堆顶。

     直接手撕代码:

    平均时间复杂度:O(nlogn) ,堆常用于topk算法,大顶堆求小值(前k个最小的值),小顶堆求大值(前k个最大的值)

class Solution:
    def heapify(self, arr, i, n): #以构建大堆为例,该函数处理单个节点
        left = 2*i+1  #左孩子节点
        right = 2*i+2 #右孩子节点
        maxi = i
        #left/right<n限制要构造堆的数组前n项,比较根节点和左右孩子节点,将最大值交换至根节点位置
        if left<n and arr[maxi]<arr[left]:
            maxi = left
        if right<n and arr[maxi]<arr[right]:
            maxi = right         
        if maxi != i:   #说明最大值不是根节点,需要进行交换
            arr[maxi], arr[i] = arr[i], arr[maxi]
            self.heapify(arr, maxi, n) #注意!交换的目标节点同样需要继续重建堆
        return arr

    def HeapSort(self, arr): #[3, 1, 4, 2, 5, 3] 为例 
        if not arr:
            return 
        n = len(arr)
        for i in range(n-1, -1, -1):  #构造堆结构需要自底向上构建。
            self.heapify(arr, i, n)
        #此时建好堆,数组为 [5, 3, 4, 2, 1, 3]
        做排序时依次将堆顶值交换到数组末尾,从大到小排列
        for i in range(n-1, -1, -1):
            arr[i], arr[0] = arr[0], arr[i] 
            self.heapify(arr, 0, i) #注意每次交换堆顶值,需要重建堆,且重建的为前i项,第i项后已经排好序。
        return arr
        
            

3、二叉排序树(二叉查找树)的定义:

某结点左子树的所有结点的值都小于该节点的值且该结点右子树的值都大于该节点的值

 !!!二叉排序树的使用性质:中序遍历后是一个有序数组。

区别:

     (1)   二叉排序树是为了实现动态查找而设计的数据结构,它是面向查找操作的,在二叉排序树中查找一个结点的平均时间复杂度是O(log n);
     (2)   堆是为了实现排序而设计的一种数据结构,它不是面向查找操作的,因而在堆中查找一个结点需要进行遍历,其平均时间复杂度是O(n)。

4、平衡二叉树是特殊的二叉排序树

改进版:平衡二叉树 AVL 为了尽量降低树的高度,平均查找长度越小,查找速度越快

平衡因子 = 左子树的高度 - 右子树的高度

平衡二叉树的条件:

1、是二叉排序树

2、满足每个结点的平衡因子绝对值不大于1

平衡二叉树的平衡调整:

左旋如下:

S结点上提,E结点下降,伴随指针向左滑动

右旋示例:

5、红黑树:寻找相对平衡的二叉树

1.每个结点要么是红的要么是黑的。

2.根结点是黑的。

3.每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。

4.如果一个结点是红的,那么它的两个儿子都是黑的。

5.对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。

红黑树变换:

1、改变颜色:红变黑、黑变黑

2、左旋、右旋

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二叉树——初识 的相关文章

  • vue 引入高德地图 amap 报错:jsapi 不生效 INVALID_USER_SCODE

    高德地图 JSAPI key 和安全密钥的使用 自2021年12月02日升级 升级之后所申请的 key 必须配备安全密钥 jscode 一起使用 报错 高德地图jsapi不生效 INVALID USER SCODE 是因为没有设置安全密钥
  • 全排列

    举例 123的全排列 123 132 213 231 321 312 全排列的个数为 n STL 实现 char s 50 cin gt gt s int k strlen s sort s s k cout lt
  • IDEA中Sprint MVC环境配置<mvc:default-servlet-handler/>报错

    问题描述 在配置applicationContext xml文件时 mvc default servlet handler 出现问题不能正常使用 提示未声明 但是mvc其他的都可以正常使用 比如 mvc annotation driven
  • Python中operator模块的操作

    Operator模块提供了一系列与Python自带操作一样有效的函数 例如 operator add x y 和表达式x y是等效的 那些特殊类的方法都有自己的函数名 为了方便起见 一些函数名是没有前导和后置 在接下来讨论的函数涉及对象比较

随机推荐

  • 计算机毕业设计选题\开题\项目\论文\答辩一套玩转毕业设计

    毕业设计选题 一 毕业设计整体流程介绍 二 毕业设计选题方式 三 毕业设计时间安排与选题技巧 1 时间安排 根据往年毕设辅导对同学们的了解毕设项目加上论文一般需要花费三到七个月左右时间 基础差的同学应尽量提前准备 2 毕设选题的时候同学们要
  • heartbeat+mysql双主复制实现高可用

    实验环境 一 搭建主主复制环境 1 1实验环境 两台机器事先都已经装好了MySQL单实例 IP 10 192 203 201 10 192 203 202 端口都是3307 二者的端口号需要保持一致 否则在最后用vip连接的时候 不能使用相
  • 判断变量是否为数组的几种方法

    1 isArray 方法 isArray 方法用于判断一个对象是否为数组 如果对象是数组返回 true 否则返回 false Array isArray arr true 2 对象原型 通过原型链判断是否具有和数组同一原型链的顶端 arr
  • Linux wget 命令下载文件示例

    inux系统中的wget是一个下载文件的工具 它用在命令行下 wget支持HTTP HTTPS和FTP协议 可以使用HTTP代理 所谓的自动下载是指 wget可以在用户退出系统的之后在后台执行 wget 非常稳定 它在带宽很窄的情况下和不稳
  • IDEA启动报错:An attempt was made to call a method that does not exist. The attempt was made from ...

    项目场景 Springboot项目 问题描述 项目无法启动 至上一次启动成功未更改代码 排除代码错误原因 具体报错如下 可能是项目未关闭完全 又重启了项目等多种原因触发这个问题 APPLICATION FAILED TO START Des
  • SourceTree系列5:贮藏和修复Bug

    1 贮藏 在切换分支时 要确保该分支已经提交 如果当前develop分支可以提交 无疑是最好的选择 但是 如果当前不能提交呢 此时我们可以使用贮藏功能 贮藏功能就是对现在的更改进行备份 注意仅仅是对更改进行备份 使用贮藏功能后 会让当前分支
  • SpringBoot 全局事务配置

    前言 传统springboot实现事务只需要在方法上添加 Transactional注解 但是需要在所有的service都加上事务 相对比较麻烦 随着项目的庞大 功能模块会随之增多 所以就需要采用AOP的方式实现全局事务处理 全局事务配置通
  • 常见的网络连接设备有哪些?

    大家好 我是你们的晴天学长 在计算级网络OSI体系结构和TCP IP模型中 网络连接设备是很重要的知识 在多个参考层中都有它的身影 请需要的小伙伴自取哦 网络互联设备 1 中继器 特点 转发所有接收到的信号 增加了网络的负担 网段上所有的节
  • .form文件_Feign完美解决服务之间传递文件、传递list,map、对象等情况

    先说下背景 前段时间有一个需求 需要将服务A生成的一个文件传递到服务B 交予服务B去做处理 最开始的时候使用的spring cloud starter openfeign 发现这一块是不支持的 然后引入了io github openfeig
  • 使用ftp服务修改删除重命名以及创建文件存取数据

    1删除 String ftpPath var ftp pub images 下载 String localPath home wang 下载 two15392444531 rar 上传 String localPath home wang
  • 【一个或多个筛选器或者Listeners启动失败 的问题探索以及解决方案】

    1 问题描述 使用IDEA作为开发工具 使用Maven作为项目管理工具 完成一个web项目后使用Tomcat作为服务器启动项目 报错一个或多个筛选器启动失败或者org apache catalina core StandardContext
  • 小程序点击右上角按钮退出,再进入时直接进入首页

    使用场景 小程序项目中 测试提了个bug 说进入某个页面之后 直接点右上角的退出 再进入小程序时 打开的是之前退出时的页面 有时左上角就没有后退按钮了 无法返回上一页 这里就涉及到页面栈的问题了 页面栈 首先先来了解一下微信小程序的运行环境
  • HTML详解连载(2)

    HTML详解连载 2 专栏链接 link http t csdn cn xF0H3 下面进行专栏介绍 开始喽 超链接 作用 代码示例 解释 经验分享 音频标签 代码示例 注意 强调 视频标签 代码示例 注意 强调 列表 作用 布局内容排列整
  • Unity Joint用法及案例

    本篇文章主要讲解如何在Unity中使用Joint组件完成一些刚体物理之间的连接效果 并且讲解一个简单案例 什么是Joint 官方文档介绍 Joint可以连接一个刚体与 另一个刚体 或世界空间某点 Joint可以通过施加力的方式来限制运动 j
  • 华硕服务器主板型号命名规则,华硕ROG系列主板命名规则详解_华硕 Maximus V Formula_主板评测-中关村在线...

    ROG玩家国度系列主板命名规则详解 玩家国度系列主板的命名方式虽然不是很常规 并且目前市售ROG系列主板仅有8款 但也遵循了一定的规则 ROG主板的命名公式为ABC AB共同代表了主板的芯片组名称 C代表主板所属系列 芯片组名称部分 Cro
  • stm32学习笔记----------从零开始

    引脚的初始化 1 GPIO InitTypeDef GPIO InitStructure 语句定义了一个GPIO InitTypeDef类型的变量 名为GPIO InitStructure 2 GPIO InitStructure GPIO
  • nginx请求超时设置

    默认60秒超时 http 配置在该区域会影响所有的server块 以下解决504问题 proxy connect timeout 300 单位秒 默认60 proxy send timeout 300 单位秒 默认60 proxy read
  • Mac/MacBookPro解决运行卡顿问题(非配置问题)

    Mac在升级后可能会出现莫名其妙的卡顿 运行缓慢等问题 如果遇到这种问题可以尝试以下几种方法恢复下 一 以安全模式启动 1 重新启动Mac 然后立即按住Shift键 显示屏上将出现Apple标志 2 看到登录窗口后松开Shift键 3 如果
  • 大厂Code Review 流程

    提交cr的流程 检查代码风格 可以安装googlestyle或者Alibaba的一些stylecheck工具 也许各开发团队会有自己的风格规范 从mainline中同步代码 注意使用 git pull rebase 而不是 git pull
  • 二叉树——初识

    链表 gt 二叉树 gt 二叉查找树 gt 平衡二叉树 二叉树时间复杂度 O logn 即2 x 树的深度 N 如 21亿点需要查找几次 2 32 21亿 查找32次 1 满二叉树 2 完全二叉树 设二叉树的深度为h 除第 h 层外 其它各