数据结构11————二叉树的定义性质及储存
来源:互联网 发布:mysql sql 表添加字段 编辑:程序博客网 时间:2024/06/05 03:08
数据结构11————二叉树的定义性质及储存
一.内容
1.二叉树的定义
2.二叉树的性质
3.二叉树的存储
二.二叉树的定义
1.形式化定义
二叉树(Binary Tree)是n(n>=0)个节点组成的集合,该集合或者为空集(空二叉树),或者由一个根节点和两颗互不相交的,分别称为根节点的左子树和右子树的二叉树组成。
2.举例
如图就是一个典型的二叉树,二叉树T,根节点为A,A的左子树为T1,右子树为T2,同时左右子树都是一个二叉树。
3.二叉树的特点
a.每个节点最多右两个节点,所以二叉树中不存在度大于2的节点
b.二叉树的左右子树是有次序的,不可以随意颠倒
c.即使节点只有一个子树,也要区分是左子树,还是右左子树
d.二叉树具有五种基本形态:
- 空二叉树
- 只有一个根节点
- 根节点只有左子树
- 根节点只有右子树
- 根节点左右子树都有
小细节:3个节点可以组成几种不同的二叉树?答案是5种
三.二叉树的性质
1. 在二叉树的第i层至多有2^(i-1)个节点
2. 深度为K的二叉树至多有2^K - 1个节点
3. 对任意一颗二叉树T,如果其叶子节点数为n0,度为2的节点为n2,n0=n2+1
证明:设度为节点总数为n,n0是叶子节点(度为0),n1是度为1的节点,n2是度为2的节点。所以有n = n0+n1+n2;
当一个节点为n时,从节点的进入情况看,除每个根节点外,每个节点都有一根连接线进入节点,所以一共有n-1个连接线.从节点的分支看,度为2的节点分支出去两根连接线,度为1的节点分支出去一根连接线.所以有n-1=2n2+n1
综上所述:n=2n2+n1+1=n0+n1+n2,所以有n0=n2+1
4.具有n个节点的完全二叉树的深度为[log2n]+1([X]表示不超过X的最大整数)
5.如果对一颗有n个节点的完全二叉树(其深度为[log2n]+1)的节点按照层序编号(从第一层到第[log2n]+1),每层从左到右),对任一节点i(1<=i<=n)
- 如果i=1,则节点i是二叉树的根,无双亲;如果i>i,其双亲是节点的[i/2]
- 如果2i>n,则节点i无左孩子(节点i为叶子节点),否则其左孩子为是节点的2i
*如果2i+1>b,则节点i无右孩子,否则其右孩子为节点的2i+1
完全二叉树的定义
若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1)的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
四.二叉树的存储
二叉树的存储和之前的线性表一样,有两种存储方式,顺序(数组)和链表
1.二叉树的顺序存储结构
将一个完全二叉树按照层次编号,按照编号存入数组中,如图所示
对于不是完全二叉树的二叉树,将它也按照二叉树的规则编号,不存在的的节点设置为^ 如图所示
缺点,对于一些特殊二叉树特别浪费空间
2.二叉树的链式存储
对于每个节点,为他设计一个数据域,两个指针域,左指针指向它的左孩子,右指针指向它的右孩子。如图所示
关于二叉树的遍历和存储代码实现,见下一篇博客
参考资料:<大话数据结构>,<数据结构与算法>
阅读全文
0 0
- 数据结构11————二叉树的定义性质及储存
- 二叉树(1)——定义,性质及结构
- 数据结构与算法专题之树——树与二叉树的定义与性质
- 二叉树的定义及性质
- 二叉树的定义,性质及存储
- 初探数据结构之“树”的定义和二叉树定义及性质
- 数据结构随笔——二叉树和五个重要性质
- 二叉树的定义、性质
- 数据结构 二叉树的性质
- 二叉树的定义、性质及常见题
- 数据结构——二叉树定义
- 二叉树 - 定义及数学性质
- 数据结构学习笔记——二叉树的类型定义
- 数据结构:二叉树的定义和性质以及特殊二叉树
- 二叉树的定义与性质
- 二叉树的定义、性质、存储
- 二叉树的定义、性质、存储
- 二叉树的定义、性质、存储
- 朴素贝叶斯算法与贝叶斯估计
- JAVA微信扫码支付模式二功能实现以及回调
- 最小生成树(Kruskal和Prim算法)
- SVPWM 电压矢量分布原理,为什么是(100-110-010-011-001-101-100)
- Windows7 下 pip设置默认豆瓣镜像源
- 数据结构11————二叉树的定义性质及储存
- 第十四周项目3
- Android Studio使用阿里云Aliyun Maven仓库
- 【笔记-C语言】 变量
- Canvas绘制雨滴(二)之setInterval与setTimeout
- Hive常见的bug与解决办法。
- 某公司面试经验 java 3年(一)
- HashMap、HashTable、ConcurrentHashMap
- Python程序计时