二叉树——初识

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(使用前将#替换为@)

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

  • 分治—快速选择算法

    文章目录 215 数组中的第K个最大元素 1 题目 2 算法原理 3 代码实现 LCR 159 库存管理 III
  • 分治-归并排序

    文章目录 315 计算右侧小于当前元素的个数 1 题目 2 算法原理 3 代码实现 493 翻转对
  • 算法题-简单系列-05-两个链表的第一个公共结点

    文章目录 1 题目 1 1 思路1 循环遍历 1 题目 输入两个无环的单向链表 找出它们的第一个公共结点 如果没有公共节点则返回空 1 1 思路1 循环遍历 使用两个指针N1 N2 一个从链表1的头节点开始遍历 我们记为N1 一个从链表2的
  • Radix Tree用法

    目录 一 radix tree定义 二 radix tree操作 参考资料 一 radix tree定义 对于长整型数据的映射 如何解决Hash冲突和Hash表大小的设计是一个很头疼的问题 radix树就是针对这种稀疏的长整型数据查找 能快
  • 【数据结构/C++】树和二叉树_二叉链表

    include
  • 二叉树先中后序遍历-12.4(day12)

    二叉树三种基本遍历方式 先序遍历 从根节点开始 逐级向下遍历 中序遍历 从左子树最后一层的最左侧节点开始遍历 当遍历到根节点后在开始遍历右子树 后续遍历 先访问叶子节点 从左子树到右子树 最后到根节点 记忆方法 先 中 后可以理解为前 中
  • 牛客网(二叉树)

    这个题目和leetcode比起来就是有一些不一样 需要我们自己来写接口函数 所以有一些麻烦 我们得写一个中序遍历的函数做最后的输出 也得写一个函数来存储字符进去 还得写一个接口函数来创造节点 这个题目就和二叉树如何创造节点很相似 我们一个一
  • 【C++】手撕string思路梳理

    目录 基本思路 代码实现 1 构建框架 2 构建函数重载 3 迭代器 4 遍历string 5 resetve 开空间 insert任意位置插入push back append 按顺序依次实现 6 erase删除 clear清除 resiz
  • 【数据结构】单链表的定义和操作

    目录 1 单链表的定义 2 单链表的创建和初始化 3 单链表的插入节点操作 4 单链表的删除节点操作 5 单链表的查找节点操作 6 单链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助
  • LeetCode326. Power of Three

    文章目录 一 题目 二 题解 一 题目 Given an integer n return true if it is a power of three Otherwise return false An integer n is a po
  • 深度学习目标检测全连接层什么意思

    在深度学习目标检测中 通常我们使用卷积神经网络 Convolutional Neural Network CNN 进行特征提取 CNN 的主要结构包括卷积层和池化层 用于从输入图像中提取特征 然而 为了最终输出目标的类别和位置信息 通常在网
  • 【华为OD】给定一个整数数组nums,请你在该数组中找出两个数,使得这两个数 的和的绝对值abs(nums[x] + nums[y])为最小值并按从小到大返回这 两个数以及它们和的绝对值

    题目描述 给定一个整数数组nums 请你在该数组中找出两个数 使得这两个数 的和的绝对值abs nums x nums y 为最小值并按从小到大返回这 两个数以及它们和的绝对值 每种输入只会对应一个答案 数组中同一 个元素不能使用两遍 输入
  • 面试150-13(Leetcode238除自身以外数组的乘积)

    代码 class Solution public int productExceptSelf int nums int n nums length int res new int n int product 1 int zerocnt 0
  • 面试150-13(Leetcode238除自身以外数组的乘积)

    代码 class Solution public int productExceptSelf int nums int n nums length int res new int n int product 1 int zerocnt 0
  • 数组对象排序 (arr.sort())

    前端面试题库 面试必备 推荐 地址 前端面试题库 对象排序 arr sort 描述 方法sort 将在原数组上对 数组元素 进行排序 即排序时不创建新的数组副本 如果想按照别的顺序进行排序 就必须提供比较函数 该函数要比较两个值 然后返回一
  • 代码随想录算法训练营第42天| ● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

    416 分割等和子集 已解答 中等 相关标签 相关企业 给你一个 只包含正整数 的 非空 数组 nums 请你判断是否可以将这个数组分割成两个子集 使得两个子集的元素和相等 示例 1 输入 nums 1 5 11 5 输出 true 解释
  • 剑指 Offer(第2版)面试题 40:最小的 k 个数

    剑指 Offer 第2版 面试题 40 最小的 k 个数 剑指 Offer 第2版 面试题 40 最小的 k 个数 解法1 排序 解法2 快速选择 解法3 优先队列 剑指 Offer 第2版 面试题 40 最小的 k 个数 题目来源 53
  • Leetcode 45 跳跃游戏 II

    题意理解 给定一个长度为 n 的 0 索引 整数数组 nums 初始位置为 nums 0 每个元素 nums i 表示从索引 i 向前跳转的最大长度 还是从初始坐标i 0的位置到达最后一个元素 但是问题不是能不能跳到 而是 最少几步能跳到最
  • Leetcode 55 跳跃游戏

    题意理解 非负整数数组 nums 最初位于数组的 第一个下标 数组中的每个元素代表你在该位置可以跳跃的最大长度 需要跳到nums最后一个元素即为成功 目标 是否能够跳到最后一个元素 解题思路 使用贪心算法来解题 需要理解局部解和最优解的关系
  • 排序:计数排序

    一 概念 计数排序是非比较排序 是对哈希直接定址法的变形应用 二 思想 利用数组统计相同数据出现的次数 例如整型数据m出现n次 就在数组m位置记录数据为n 最后从头遍历数组打印数据即可 通俗来讲就是 数组下标即为数据 下标所指位置的值即为数

随机推荐

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

    毕业设计选题 一 毕业设计整体流程介绍 二 毕业设计选题方式 三 毕业设计时间安排与选题技巧 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 层外 其它各