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

文章目录

  • 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. 二叉树变森林: 根的右子树独立成根 各个二叉树变树
    在这里插入图片描述

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

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

相关文章

SpringBoot3 整合Kafka

官网:https://kafka.apache.org/documentation/ 消息队列-场景 1. 异步 2. 解耦 3. 削峰 4. 缓冲 消息队列-Kafka 1. 消息模式 消息发布订阅模式,MessageQueue中的消息不删除,会记录消费者的偏移量 2. Kafka工作原理 同一个消费者组里的消…

Volume Control 2

为游戏添加音乐和音效总是需要一些编码来设置一个系统来控制、显示和保存应用程序的音量设置。 音量控制的设计是为了立即为您设置这些内容,让您有更多时间专注于最重要的事情——制作出色的游戏! 在版本2中,我们对系统进行了重新设计,使其更加模块化、灵活,甚至更易于使用…

工具系列:TimeGPT_(1)获取token方式和初步使用

文章目录 介绍获取Token用法数据的重要要求使用DateTime索引推断频率。 介绍 Nixtla的TimeGPT是一种用于时间序列数据的生成式预训练预测模型。TimeGPT可以在没有训练的情况下,仅使用历史值作为输入,为新的时间序列生成准确的预测。TimeGPT可以用于各种…

ubuntu磁盘管理常用命令

写的不全,后面随时修改。 Linux 磁盘管理常用三个命令为 df、du 和 fdisk。 df(英文全称:disk free):列出文件系统的整体磁盘未使用量du(英文全称:disk used):检查磁盘空…

如何避免卡尔曼滤波器的发散? Q P R参数怎么调?

文章目录 1.什么是发散2.发散的原因3.解决方法4.参数意义及调试方法5.工程经验(1)抑制P矩阵发散(2)抑制K矩阵发散1.什么是发散 当滤波的实际误差远远超过滤波误差的允许范围,甚至于趋向无穷大,使得滤波器推动作用,这种现象叫做滤波的发散。 2.发散的原因 (1)系统的…

【PID精讲12】基于MATLAB和Simulink的仿真教程

文章目录 写在前面一、基于Simulink的仿真1. 新建Simulink模型2. 保存Simulink模型3. 建模4. 运行二、基于MATLAB的仿真1. 编码2. 运行3. 调整曲线格式4. 导出图窗写在前面 第11讲介绍的连续系统的数字PID仿真是基于 Matlab的 M 语言实现的,对于初学者或者工程应用人员来说,…

Bytebase:统一数据库 CI/CD 解决方案 | 开源日报 No.128

bytebase/bytebase Stars: 7.9k License: NOASSERTION Bytebase 是一个数据库 CI/CD 解决方案,为开发人员和 DBA 提供统一的工具来管理不同数据库系统的开发生命周期。其主要功能包括标准化操作流程、SQL 代码审查、GitOps 集成以及数据访问控制等。关键特性和核心…

关于edge浏览器以及插件推荐

目录 广告拦截和隐私工具 密码管理器 生产力和组织工具 写作和语法工具 购物助手 娱乐和个性化 安全性和VPN 开发者工具 其他实用工具 Microsoft Edge 是一款基于Chromium开源项目的现代网络浏览器,由微软开发。它是Internet Explorer的继任者,…

QT 输入框输入限制 正则表达式限制 整理

在使用 输入数值时,经常遇到限制其范围的需要,比如角太阳高度角范围为[-90,90],经度值范围[-180,180],方位角范围[0,360]。Qt提供了QIntValidator和QDoubleValidator可以限定数值输入范围,如使用QIntValidator限制整数…

TypeScript学习笔记归纳(先做基础梳理,后期不断丰满,持续更新ing)

文章目录 前言 二、TypeScript的优势体现在哪里? 1、执行时间上的区别 2、基础数据类型区别 3、TS优势 三、TypeScript的关键特性 四、TypeScript的类型系统 1、什么是类型注释? 2、类型系统核心 - 常用类型 1) 基本类型&#xff0…

计网03-数据的封装和解封装

数据封装和解封装的过程 实例:有两台电脑 PC1和PC2,PC1要给PC2发送一个文本文件 1、数据的封装过程: 应用层:将原始数据转换成计算机能识别的二进制数传输层:在传输层是有固定的传…

智能,轻量,高效的爬虫工具 (爬虫宝第一代), HSpider

场景 之前玩爬虫宝一时爽,但是我很快发现了一个致命的问题。就是chat3.5 有时候误判,Claude2 是遇到大一点的html就无法解析,chat4 Api没有申请下来,chat3.5 误判这个可以纠正,但是每次爬取花费的钱都是2刀以上&#…

springboot 查询

ServiceImpl中 getBaseMapper()的使用 public IPage<ProductPageVO> getProductPage(Integer regionOrCityCode, Integer brandId, LocalDate usedDate, Page<ProductPageVO> page) {return getBaseMapper().getProductPage(regionOrCityCode, brandId, usedDate, …

为什么说依赖抽象就变得更加灵活呢?举例

说依赖抽象变得更加灵活的主要原因在于它提供了更大的替换和扩展的空间。让我们通过一个简单的例子来说明&#xff1a; 考虑一个电商系统&#xff0c;其中有一个OrderProcessor类负责处理订单&#xff0c;它依赖于一个PaymentGateway用于处理支付。最初的设计可能如下所示&…

MacOS安装PHP5.6的Redis扩展

更多版本下载地址&#xff1a;https://pecl.php.net/package/redis 安装步骤 wget http://pecl.php.net/get/redis-2.2.7.tgztar -zxvf redis-2.2.7.tgzcd redis-2.2.7phpize./configure --with-php-config/usr/local//php/5.6.40/bin/php-configmake && make instal…

LabVIEW进行激光斑点图像处理与分析

LabVIEW进行激光斑点图像处理与分析 近年来&#xff0c;激光技术的应用日益繁荣。激光光斑的质量评估和分析技术决定了应用效果&#xff0c;对机器视觉、武器装备、光学测量和医疗设备产生深远影响。就具体用途和技术而言&#xff0c;激光光斑的采集和处理至关重要。即插即用的…

前端-部署配置前端项目时,关于env.development、env.production以及nginx.conf的关系

今天要打包前端项目生产镜像部署&#xff0c;学习到了关于env.development、env.production以及nginx.conf的关系 env.development 首先是env.development&#xff0c;这里面主要放的是我们本地开发时的代理服务器&#xff08;需要代理来解决跨域问题的话&#xff09; env.p…

渗透测试 | php的webshell绕过方法总结

目录 1.php的异或运算 2.通过获取注释去绕过 3.利用字符的运算符​​​​​​​ 4.通过end函数代替[] 5.通过常量去绕过 6.字符串拼接双美元符 7.通过函数定义绕过 8.通过类定义&#xff0c;然后传参分割 9.多传参方式绕过​​​​​​​ 10.通过get_defined_function…

离散傅立叶变换和线性变换的关系:什么是线性空间?

离散傅立叶变换和线性变换的关系&#xff1a;什么是线性空间&#xff1f; 本篇博客是在学习线性空间知识的时候联想到的&#xff0c;通过分析DFT背后的数学原理&#xff0c;以便更好地理解什么是线性空间、什么是线性变换。 1、离散傅立叶变换&#xff08;DFT&#xff09;和F…

使用Maven Archetype插件制作项目脚手架(一)

Archetype是一个Maven项目模板工具包。通过Archetype我们可以快速搭建Maven项目。比如我们在ide里面创建项目时&#xff0c;可以选择很多maven内置的Archetype&#xff0c;我们最常用的可能是maven-archetype-quickstart 当然maven提供了能力&#xff0c;让我们自定义项目结构&…