IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 二叉树数据结构 -> 正文阅读

[数据结构与算法]二叉树数据结构


三 树形结构
?? ?1 树
?? ??? ?节点、根节点、父节点、子节点、兄弟节点(相同父亲才叫兄弟节点)
?? ??? ?一棵树可以没有任何节点,称为空树
?? ??? ?一棵树可以只有一个节点,也就是只有根节点
?? ??? ?子树、左子树、右子树 :这个就是有直接关系的树,孙子不算
?? ??? ?节点的度:子树的个数
?? ??? ?树的度:所有节点度中的最大值
?? ??? ?叶子节点:度为0的节点
?? ??? ?非叶子节点:度不为零的节点
?? ??? ?层数:根节点在第一层,根节点的子节点在第二层,
?? ??? ?节点的深度:从根节点到当前节点的唯一路径上的节点数
?? ??? ?节点的高度:从当前节点到最远叶子节点的路径上的节点总数
?? ??? ?树的深度:所有节点深度中的最大值
?? ??? ?树的高度:所有节点高度中的最大值 ?
?? ??? ?树的深度= 树的高度
?? ??? ?
?? ??? ?有序树:树中任意节点的子节点之间有顺序关系 ? ? ? ? ? ? ? ? ? ? ? ? 有序树和无序树只针对子节点
?? ??? ?无序树:树的任意节点之间的子节点之间没有顺序 ?也称自由树
?? ?2 二叉树 binary tree
?? ??? ?定义:每个节点的度最大为2 并且左子树和右子树是有顺序的
?? ??? ?特点 :
?? ??? ??? ?1每个节点的度最大是2?
?? ??? ??? ?2 左子树以及右子树都是有顺序的
?? ??? ??? ?3 即使节点只有一颗子树,也要区分左右子树
?? ??? ??? ?4 非空二叉树的第i层,最多有2的i次方-1个节点
?? ??? ??? ?5 在高度为h的二叉树上最多有2的h次方-1个节点
?? ??? ??? ?6 对于任意一个二叉树,如果叶子节点个数为n0,度为2的节点个数为n2,那么就有n0=n2+1
?? ??? ?真二叉树:所有节点的度要么是零要么是二
?? ??? ?满二叉树:所有节点的度要么是0,要么是2,并且所有的叶子节点都在最后一层
?? ??? ??? ?特点:
?? ??? ??? ??? ?1在同样高度的二叉树中,满二叉树的叶子节点数量最多,总节点数量最多
?? ??? ??? ??? ?2 满二叉树一定是真二叉树,真二叉树不一定是满二叉树。
?? ??? ??? ??? ?3 满二叉树的高度是h 那么第i层的节点数量是2的i次方减一
?? ??? ?完全二叉树:叶子节点只会出现在最后两层,并且最后一层的叶子节点都靠左对其(叶子节点从上往下,从左到右进行排序)
?? ??? ??? ?特点:?? ?
?? ??? ??? ??? ?1 度为1的节点只有左子树
?? ??? ??? ??? ?2 度为1 的节点要么是1个,要么是0个
?? ??? ??? ??? ?3 同样节点数量的二叉树,完全二叉树的高度最小
?? ??? ??? ??? ?4 高度为h,则至少有2的h-1次方个节点,最多有2的h次方-1个节点
?? ??? ??? ??? ?5 具有n个节点的完全二叉树,从上到下,从左到右对节点从1开始进行编号,对于任意第i个节点,前提是i大于1 他的父亲节点编号是floor(i/2)
?? ??? ??? ??? ?6 总节点数量是n ?如果n是偶数,则叶子节点数量是二分之n ?如果n是奇数 叶子节点数量是n+1然后除以2 总结起来就是floor(n/2+1/2),除法默认就是向下取整直接除以2就行了
?? ??? ??? ??? ?而非叶子节点是ceiling(())
?? ??? ??? ??? ?
?? ?3 二叉搜索树:
?? ??? ?二叉搜索树:添加、删除、搜索的最坏的时间复杂度均可优化至O(logn)
?? ??? ?特点:任意一个节点的值都大于其左子树所有节点的值
?? ??? ? ? ? ?任意一个节点的值都小于其右子树所有节点的值
?? ??? ??? ? ?二叉搜索树存储的元素必须具备可比较性
?? ??? ?接口设计:
?? ??? ?int size()
?? ??? ?isEmpty()
?? ??? ?add(E element) 建立比较器,找到父节点,然后判断在父节点的位置,然后size++
?? ??? ?remove(E element)
?? ??? ?contains(E element)
?? ??? ?
?? ??? ?遍历:传递处理逻辑 增强遍历(在处理逻辑上加上判断):目的是随时停止遍历
?? ??? ?前序遍历
?? ??? ?中序遍历
?? ??? ?后序遍历
?? ??? ?层序遍历
?? ??? ?
?? ??? ?打印?
?? ??? ?
?? ??? ?获取二叉树的高度
?? ??? ?
?? ??? ?判断是否是二叉树
?? ??? ?
?? ??? ?反转二叉树
?? ??? ?
?? ??? ?算法重点使用递归,迭代
?? ??? ?
?? ??? ?重构二叉树:前序遍历和中序遍历 ?以及后序遍历加上中序遍历 能确定唯一的二叉树
?? ??? ?
?? ??? ?前驱节点:left != Null ? 以及 ?left = null && parent != null ? 以及 left == null && parent == null 没有前驱节点
?? ?4 平衡二叉搜索树(avl树) ?让添加删除的时间复杂度维持在O(logn)
?? ??? ?背景:
?? ??? ?二叉树搜索树的时间复杂度 是O(logn) 就是二叉树的高度
?? ??? ?二叉搜索树的缺点:
?? ??? ?1 当有序添加元素时退化成链表
?? ??? ?2 删除节点的时候也会退化成链表
?? ??? ?平衡二叉搜索树:当节点数量固定的时候,左右子树的高度越接近,这颗二叉树就越平衡
?? ?
?? ??? ?改进二叉搜索树
?? ??? ?首先,节点的添加和删除时无法限制的,
?? ??? ?接着,在节点的添加、删除操作之后,想办法让二叉搜索树恢复平衡(减少树的高度)
?? ??? ?如果接着继续调整节点的位置,完全可以达到理想平衡,但是付出的代价比较大
?? ??? ?如果调整的次数比较多,反而增加了时间复杂度
?? ??? ?总结:用尽量少的调整次数达到适度平衡就可以
?? ??? ?经典的平衡二叉树
?? ??? ?avl树、红黑树
?? ??? ?平衡因子:某节点的左右子树的高度差
?? ??? ?特点:
?? ??? ?每个节点的平衡因子只可能是1 0 -1?
?? ??? ?每个节点的左右子树的高度差不超过1?
?? ??? ?搜索、添加、删除的时间复杂度是O(logn)
?? ??? ?
?? ??? ?添加导致的失衡:
?? ??? ?可能会导致所有的祖先节点都失衡,但是只要让高度最低的失衡节点恢复平衡,整棵树就平衡了
?? ??? ?父节点不会失衡,非祖先节点不会失衡,
?? ?
?? ??? ?ll 右边旋转 单旋 ? ll的意思是在失衡节点的左边左边
?? ??? ?rr 左边旋转 单旋
?? ??? ?LR 双旋 先左边,后边右边
?? ??? ?RL 双旋 先右边 后左边 ? ? ?
?? ??? ?总结: 相同字母反,不同字母同
?? ?
?? ??? ?删除导致的失衡:
?? ??? ?可能会导致父节点或者祖父节点失衡,但是只有一个能失衡,如果删除导致父节点失衡了,那么这个删除的节点一定是比较短的
?? ??? ?让父节点恢复平衡后,可能会导致更高的祖先节点失衡,但是最多需要ologn次调整
?? ?
?? ?5 B树
?? ??? ?讲b树的时候引入红黑树
?? ??? ?红黑树性质:
?? ??? ?1 节点是red或者black
?? ??? ?2 根节点是black
?? ??? ?3 叶子节点都是black
?? ??? ?4 红色节点的parent、子节点都是black 从根节点到叶子节点的所有路径上不能有两个连续的red节点
?? ??? ?5 从任意一个节点到叶子节点的所有路径都包含相同数目的black节点
?? ??? ?
?? ??? ?B树是一种多路搜索树,多用于文件系统、数据库的实现
?? ??? ?特点:一个节点可以存储超过两个元素、可以超过两个节点
?? ??? ? ? ? ?拥有二叉树的一些性质
?? ??? ??? ? ?平衡,每个节点的所有子树高度一致
?? ??? ??? ? ?比较矮
?? ? ? ?m阶b树:就是一个节点最多有m个子节点
?? ??? ?性质:
?? ??? ?1 节点内元素个数?
?? ??? ?根节点: 1 <= x <= m-1
?? ??? ? ? 非根节点:(m/2)取整减去1 <= x <m-1
?? ??? ?2 节点数 y= x + 1,就是在原来元素个数的范围上运算就行了
?? ??? ?代表:根节点 2<= y <= m
?? ??? ? ? ? ?非根节点:(m/2)取整 <= y <= m ? m =3, ?2<= y <=3 因此可以成为(2,3)树
?? ??? ?
?? ??? ?b树和二叉搜索树的关系
?? ??? ?两代合并,最多拥有四个子节点.
?? ??? ?三代合并,最多拥有八个子节点.
?? ??? ?n代合并,则最多是拥有2的n次方个子节点.
?? ??? ?
?? ??? ?添加:新添加的元素一定是在叶子节点中
?? ??? ?
?? ??? ?上溢:一个节点存储超过阶数的元素
?? ??? ? 一个节点引发上溢,那么这个节点的元素必然是m个
?? ??? ? 解决办法:将k位置上的元素向上与父节点合并 ?,如果父节点也触发了上溢,一直向上溢,知道根节点 ? 一旦到根节点了,则可能让b树高度加1
?? ??? ??
?? ??? ? 删除,
?? ??? ? 如果删除元素在叶子节点中,直接删除即可.
?? ??? ? 如果删除元素在非叶子节点中,找到前驱然后替换,删除前驱即可
?? ??? ? 下溢:
?? ??? ? 节点的元素删除之后,元素个数小于最低限制
?? ??? ? 产生下溢出的节点数量必然等于(m/2)取整-2
?? ??? ? 从左侧相邻节点借元素.
?? ??? ??
?? ??? ? 如果临近节点元素正好是最低限制的,无法借出,则从父节点中拿出一个,触发下溢,一直到根节点则可能导致b树变低
?? ??? ??
?? ??? ? 作业四阶b树从1 加到22 然后再一个一个删除
?? ??? ??
?? ?5 红黑树
?? ??? ?注意这里面再最后面都是有一个叶子节点的
?? ??? ?对于红黑树,判断的时候尽量使用颜色来进行判断
?? ??? ?性质:
?? ??? ?红黑树性质:
?? ??? ?1 节点是red或者black
?? ??? ?2 根节点是black
?? ??? ?3 叶子节点都是black
?? ??? ?4 红色节点的parent、子节点都是black 从根节点到叶子节点的所有路径上不能有两个连续的red节点
?? ??? ?5 从任意一个节点到叶子节点的所有路径都包含相同数目的black节点
?? ??? ?
?? ??? ?特点:红黑树其实与四阶b树具有等价性 ? 当Black节点与它的red子节点融合在一起的时候,形成一个b树节点
?? ??? ?红黑树中黑色节点的个数,就是四阶b树中,总节点数量
?? ??? ?
?? ??? ?无论添加还是删除只要操作之后还是红黑树就可以了
?? ??? ?添加:一共十二种情况 ?
?? ??? ?新添加节点直接设置为红色 ?这个不是绝对的,先按照符合b树的观点,就是一个黑色带着两个红色子节点。
?? ??? ?
?? ??? ?1 parent是black 不用任何操作 四种情况
? ? ? ? 2 叔父节点不是红色, 四种情况
?? ??? ??? ?进行双旋转操作
?? ??? ?3 叔父节点是red ?这个只需要染色,然后上溢出就行了
?? ??? ??? ?parent/uncle 染色乘black ? 上溢的时候当作新添加到上一层的节点。
?? ??? ??? ?向上合并,如果上溢到根节点,则将根节点染色乘black就行了
?? ??? ??? ?
?? ??? ?删除:
?? ??? ?在b树中删除节点都是在叶子节点中
?? ??? ?
?? ? ? ?1 红色节点直接删除,不用任何处理
?? ??? ?2 黑色节点
?? ??? ? ? ?1 拥有两个red子节点的black节点 不可能直接被删除,会找它的子节点替代删除,自己并没有被删除
?? ??? ??? ?2 拥有一个red子节点的black节点 需要删除 ?,用来替代的节点是红色节点染色成为黑色就可以
?? ??? ??? ?3 黑色叶子节点 ?需要删除· 1 兄弟是黑色,有至少一个红色兄弟节点,可以借 ?2 兄弟是黑色,兄弟节点没有红色子节点。此时如果父节点是红色,不会连锁下溢,如果父节点是黑色必然下溢出
?? ??? ??? ??? ?兄弟是红色,能借出的是兄弟的儿子,把兄弟的儿子旋转之后变成兄弟。变成兄弟是黑色情况
?? ??? ?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-16 11:33:17  更:2021-07-16 11:33:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/7 20:39:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码