树的表示方式有

  1. 树形图表示法:逻辑结构描述直观
  2. 嵌套集合表示法(文氏图表示法)
  3. 凹入表示法
  4. 广义表表示法

二叉树

二叉树是另一种重要的树形结构,是度为2的有序树,它的特点是每个结点至多有两棵子树。

二叉树的递归定义

二叉树是n(n≥0)个结点的有限集。它或者是空集(n=0),或者同时满足以下两个条件:

(1) 有且仅有一个根结点;

(2) 其余的结点分成两棵互不相交的左子树和右子树。

二叉树的特点

如果二叉树的根结点只有一棵子树,必须明确区分它是左子树还是右子树,因为两者将构成不同形态的二叉树。

注意:二叉树不是树的特例。它们是两种不同的数据结构。

二叉树举例

二叉树的性质

性质1:在二叉树的第i层上至多有2i-1 个结点。 (i≥1)

性质2:深度为 k 的二叉树上至多含 2k-1 个结点(k≥1)

证明:

性质3:对任何一棵二叉树,若它含有n0个叶子结点、n2个度为2的结点,则必存在关系式:n0= n2+1。

即 叶子结点数=度2结点 + 1

性质4:具有n个结点的完全二叉树的深度为 [log2n] +1  下取整

证明:

性质5:

若对含 n 个结点的完全二叉树从上到下且从左至右进行 1 至 n 的编号,则对完全二叉树中任意一个编号为 i 的结点:

(1) 若 i=1,则该结点是二叉树的根,无双亲, 否则,编号为 i/2 的结点为其双亲结点;

(2) 若 2i>n,则该结点无左孩子,否则,编号为 2i 的结点为其左孩子结点;

(3) 若 2i+1>n,则该结点无右孩子结点, 否则,编号为2i+1 的结点为其右孩子结点。

两类特殊的二叉树:

满二叉树

指的是深度为k且含有2k - 1个结点的二叉树。

特点:

(1)每一层上结点数都达到最大

(2)度为1的结点n1=0,树叶都在最下一层。

满二叉树结点层序编号方法:

从根结点起从上到下逐层(层内从左到右)对二叉树的结点进行连续编号。

 完全二叉树

树中所含的 n 个结点和满二叉树中编号为 1 至 n 的结点一一对应。

完全二叉树的特点:

1、满二叉树是完全二叉树,完全二叉树不一定是满二叉树;

2、在完全二叉树中,若某个结点没有左孩子,则它一定没有右孩子,即该结点必是叶结点。

 二叉树的存储结构:

 1.顺序存储结构

用一组地址连续的存储单元,以层序顺序存放二叉树的数据元素,结点的相对位置蕴含着结点之间的关系。

如完全二叉树

非完全二叉树,存储时必须将相应的位置空出来,使存放的结果符合完全二叉树的形状。

所以,二叉树顺序存储结构仅适用于完全二叉树。

若存储非完全二叉树时有可能对存储空间造成极大的浪费:

在最坏的情况下,一个深度为K且只有K个结点的右单支树需要2K-1个结点存储空间。

二叉树的链式存储结构

根据二叉树的非线性结构的特点,常用链式存储方式来表示二叉树。

二叉树的链式存储结构有3种,它们是二叉链表、三叉链表和线索链表。

二叉链表存储结构

把每个结点分成三个域:一个域存放结点本身的信息,另外两个是指针域,分别存放左、右孩子的地址。每个结点的结构表示为:

二叉链表的C 语言类型描述如下:

typedef char TElemType;
typedef struct Node { TElemType      data;struct Node  *lchild, *rchild;
} BiTNode, *BiTree;

三叉链表(带双亲指针的二叉链表)

转载于:https://www.cnblogs.com/lisen10/p/10850336.html

数据结构与算法6—树相关推荐

  1. 数据结构与算法——AVL树类的C++实现

    关于AVL树的简单介绍能够參考: 数据结构与算法--AVL树简单介绍 关于二叉搜索树(也称为二叉查找树)能够參考:数据结构与算法--二叉查找树类的C++实现 AVL-tree是一个"加上了额 ...

  2. 数据结构与算法--B树原理及实现

    B树 前几篇文中讨论的数据结构我们都是假设所有的数据都存储在计算机的主存中.可说总要那么海量的数据需要通过个中数据结构去存储,我们不可能有这么多内存区存放这些数据.那么意味着我们需要将他们放磁盘.所以 ...

  3. 《数据结构与算法》——树与二叉树之遍历总结

    <数据结构与算法>--树与二叉树之遍历总结 树与二叉树部分计划分为三次进行复习总结,第一次为基本概念和二叉树的遍历,第二次内容为线索二叉树以及树和森林,第三次为树与二叉树的应用. 目录 & ...

  4. 数据结构与算法(3)——树(二叉、二叉搜索树)

    前言:题图无关,现在开始来学习学习树相关的知识 前序文章: 数据结构与算法(1)--数组与链表(https://www.jianshu.com/p/7b93b3570875) 数据结构与算法(2)-- ...

  5. 高级数据结构与算法 | AVL树 (高度平衡树)

    文章目录 AVL树 实现思路 数据结构 查找 平衡因子 旋转 右旋 左旋 右左双旋 左右双旋 插入 删除 AVL树的验证 中序遍历 平衡判断 AVL树的性能 完整代码实现 AVL树 AVL树是最先发明 ...

  6. 数据结构与算法:树与二叉树python实现

    最近复习一遍数据结构与算法,做一些笔记,大家可以一起复习. 一.树的一些容易混淆的定义: 结点层:根结点的层定义为1:根的孩子为第二层结点,依此类推: 树的深度(或高度):树中最大的结点层: 满二叉树 ...

  7. 数据结构和算法——kd树

    一.K-近邻算法 K-近邻算法是一种典型的无参监督学习算法,对于一个监督学习任务来说,其 m m个训练样本为: {(X(1),y(1)),(X(2),y(2)),⋯,(X(m),y(m))} \lef ...

  8. 高级数据结构与算法 | B树、B+树、B*树

    文章目录 搜索结构 B树 B树的插入 B树的遍历 B树的性能 B+树 B+树的插入 B+树的遍历 B*树 B*树的插入 总结 搜索结构 如果我们有大量的数据需要永久存储,就需要存储到硬盘之中,但是硬盘 ...

  9. C++数据结构与算法(九) 树,优先级队列,最大堆的实现

    树: 用来表示具有结构层次的数据,应用: 软件工程技术:模块化技术 根: 子树: 在树中,每个元素都代表一个节点. 树的级: 根是一级,根的孩子是二级,一次往下,有三级,四级... 树的高度(深度): ...

最新文章

  1. 一文看懂深度学习模型压缩和加速
  2. Centos安装g++错误 :No package g++ available
  3. iOS开发之自定义View的一些坑
  4. Xamarin XAML语言教程Xamarin.Forms中程序状态与进度(一)
  5. 个人博客作业_week2
  6. 转:日志组件logback的介绍及配置使用方法
  7. navicat for mysql 用户_Navicat for MySQL 怎么/怎么添加管理用户?Navicat for MySQL 添加管理用户教程_37游游网...
  8. 阿里技术专家光锥:亿级长连网关的云原生演进之路
  9. SqlServer的分割函数
  10. python动态创建字典_如何在Python中创建动态命名字典?
  11. VIM编辑器使用的小技巧
  12. mac/linux下java项目使用本机自带ssh和scp命令,自动复制上传并部署的脚本
  13. Android Studio 使用技巧
  14. 关于DeviceLock和QQ2005正式版
  15. vue切换tab更新路由created执行两次
  16. 为什么聪明人未能拯救世界?|《流浪地球》冷思考...
  17. mysql空间不足_磁盘空间不足的临时解决方案
  18. STANet: 基于时空自注意力的遥感图像变化检测模型,提出一个新的大型变化检测数据集LEVIR-CD
  19. 自动化软件测试流程的七个步骤包括哪些内容
  20. ping网络时偶尔会出现一个高延迟包的研究

热门文章

  1. ASP.NET 实现Base64文件流下载PDF
  2. 链方法[C# 基础知识系列]专题三:如何用委托包装多个方法——委托链
  3. JavaScript常用正则表达式收集
  4. 轻轻松松,一键获取3000个外链
  5. 如何判断网通、电信、铁通IP地址分配段
  6. vue.js开发环境搭建
  7. node --- 实践中理解跨域
  8. ES5-3 循环、引用值初始、显示及隐式类型转换
  9. 高并发大流量专题---10、MySQL数据库层的优化
  10. 架构师不可不知的十大可扩展架构