当前位置: 首页 > news >正文

[数据结构]树与二叉树的性质

文章目录

  • 0.二叉树的形态和基本性质
  • 1.完全二叉树的叶子节点个数
  • 2.树的叶子节点个数
  • 3.线索二叉树
  • 4.树和森林和二叉树
  • 5.平衡二叉树的最少结点数
  • 6.树/二叉树/森林的转换

0.二叉树的形态和基本性质

  1. 一棵二叉树具有5中基本形态
  2. n个结点可以构造的二叉树种数: C2n-n/n+1

一棵树 n个结点

  1. n-1条边: 每一个结点头上都有一个边 除了根节点
  2. 对于二叉树 度数和 == n-1 每一条边就是一个度
  3. x0 = x2 + 1
  4. 边数 == 2x2 + x1

先根遍历和后根遍历序列完全相反

  1. 该树高度 == 结点数
  2. 该树只有一个叶子结点

对于二叉树的先/中/后根遍历

顺序完全一样 只不过根的位置不同

二叉树只有度为0和2的结点 二叉树结点个数至少为

2(h-1) + 1 : 第一层为1个 其余均为2个

二叉树的后序遍历非递归算法不使用栈

最佳方案是采用三叉链表

1.完全二叉树的叶子节点个数

  1. 假设
    叶子节点即度为0的有n0个
    度为1的节点个数为n1
    度为2的节点个数为n2
  2. 对于二叉树:
    n0+n1+n2=n
    n0=n2+1
    ===>n0=(n+1-n1)/2
  3. 对于完全二叉树:
    n1=0 或 1
  4. 总结:
    n1=0或者n为奇数 ==> n0 = (n+1)/2
    n1=1或者n为偶数 ==> n0 = n/2

2.树的叶子节点个数

设树T的度为4,其中度为1、2、3、4的结点个数分别为4、2、1、1。则T中有多少个叶子结点?

  1. n = n0 + n1 + n2 + n3 + n4 = n0 + 8
  2. 边数 = n - 1 且 度数和 = n - 1 ==> n = 度数和 + 1
  3. n = 14+22+31+41+1 = 16
  4. x0 == 8

3.线索二叉树

虽然在中序遍历时具有一定的优势,但也存在一些问题无法解决,包括以下几个方面:

  1. 插入和删除操作麻烦且速度较慢:由于线索二叉树中每个结点都需要维护前驱和后继指针,因此在插入和删除结点时需要更新这些指针,操作相对复杂且速度较慢。

  2. 线索子树不能共用:线索二叉树中的线索只能在某种遍历方式下使用,而不能在其他遍历方式下使用。这意味着如果需要在不同的遍历方式下使用线索,就需要对二叉树进行多次线索化,导致额外的时间和空间开销。

  3. 不支持动态结点的插入和删除:线索二叉树的线索化过程是在遍历过程中完成的,因此无法在遍历过程中动态地插入和删除结点。如果需要在遍历过程中动态地修改二叉树的结构,就需要重新线索化整个二叉树,效率较低。

  4. 需要额外的存储空间:线索二叉树中每个结点都需要维护前驱和后继指针,这会占用额外的存储空间。尤其是在结点较多的情况下,额外的存储空间开销会比较大。

综上所述,线索二叉树虽然在中序遍历时具有一定的优势,但在插入和删除操作、线索共用、动态结点修改和额外存储空间等方面存在一些问题无法解决。

不能有效解决先序线索二叉树找先序前驱和后序线索二叉树找后序后继。

4.树和森林和二叉树

  1. 求一个有 n 个非终端结点的森林/树对应的二叉树中右指针域为空的结点个数

n+1

  1. 树的先根遍历与其对应的二叉树先序遍历序列相同
  2. 树的后根遍历与其对应的二叉树中序遍历序列相同

对于一个有N个结点、K条边的森林,求有几棵树

假设有m棵树,第i棵树的节点数为ni ==> 第i棵树的边数为ni-1。
(n1 - 1) + … + (nm - 1) = K ⇒ N - m = K ⇒ m = N - K

5.平衡二叉树的最少结点数

F(n) = F(n-1) + F(n -2 ) + 1

F(1) = 1
F(2) = 2
F(3) = 4
F(4) = 7

最多即为满二叉树

6.树/二叉树/森林的转换

  1. 树变二叉树 : 兄弟相连留长子
    在这里插入图片描述
  2. 二叉树变树 : 左孩右右连双亲 去掉原来右孩线
    在这里插入图片描述
  3. 森林变二叉树: 各个树先变成二叉树 二叉树根相连
    在这里插入图片描述
  4. 二叉树变森林: 根的右子树独立成根 各个二叉树变树
    在这里插入图片描述

相关文章:

  • ------- 计算机网络基础
  • 思福迪运维安全管理系统 test_qrcode_b RCE漏洞复现
  • 【FPGA】Verilog 实践:优先级编码器 | Priority encoder
  • 一个实用的Wrapper类,解决mfc使用sqlite3时的中文乱码问题
  • W5500-EVB-Pico评估版介绍
  • 二、C#基础语法( 异常处理)
  • 使用JAVA Zookeeper构建分布式键值存储
  • STM32移植LVGL图形库
  • ❀My排序算法学习之选择排序❀
  • 【Linux】线程池设计/单例模式/STL、智能指针与线程安全/读者写者问题
  • PostgreSQL10数据库源码安装及plpython2u、uuid-ossp插件安装
  • 1、TCP 和 UDP 区别? 2、TCP/IP 协议涉及哪几层架构? 3、描述下 TCP 连接 4 次挥手的过程?为什么要 4 次挥手?
  • Guava的Joiner的日常使用
  • 多维时序 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多变量时间序列预测
  • 隧道代理HTTP工作原理:一场奇妙的网络魔法表演
  • [nginx文档翻译系列] 控制nginx
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • AHK 中 = 和 == 等比较运算符的用法
  • cookie和session
  • DataBase in Android
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Github访问慢解决办法
  • Intervention/image 图片处理扩展包的安装和使用
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • java第三方包学习之lombok
  • Python中eval与exec的使用及区别
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 阿里云购买磁盘后挂载
  • 电商搜索引擎的架构设计和性能优化
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 前端
  • 如何合理的规划jvm性能调优
  • 世界上最简单的无等待算法(getAndIncrement)
  • 赢得Docker挑战最佳实践
  • 阿里云移动端播放器高级功能介绍
  • ​Java并发新构件之Exchanger
  • #Z2294. 打印树的直径
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (Forward) Music Player: From UI Proposal to Code
  • (二)hibernate配置管理
  • (二)丶RabbitMQ的六大核心
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (过滤器)Filter和(监听器)listener
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (一)RocketMQ初步认识
  • (转载)CentOS查看系统信息|CentOS查看命令
  • ./和../以及/和~之间的区别
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .jks文件(JAVA KeyStore)
  • .net web项目 调用webService