第六章 二叉树和树

来源:互联网 发布:linux停机命令 编辑:程序博客网 时间:2024/06/04 18:44

第六章 二叉树和树

标签(空格分隔): 数据结构


承前启后:第一章绪论,介绍数据结构;第三章讲解了简单的线性表,主要是顺序表和链表。第四章讲了字符串的内容,主要是匹配。第五章在顺序表的基础上实现了栈和队列。
下面几章就不是简单的线性结构,而是更复杂的联系。
树形结构:树形结构也是由结点和结点之间的关系构成。其最主要的特征包括:

  1. 一个结构不空,就存在唯一的起始节点。
  2. 树根外的结点都只有一个前驱。一个结点可以有0个或者多个后继。
  3. 从树根结点出发,经过若干次后继关系可以达到结构中的任一个结点
  4. 从树结构的任意两个不同结点出发,通过后继关系可达的两个结点集合,或者互不相交,或者是父子集关系。

一、二叉树:概念和性质

根结点、树叶结点、分支节点
路径,结点的层和树的高度
一棵二叉树的高度是树中结点的最大层数。
二叉树的性质:
5. 在非空二叉树第i层中至多有2^i个结点(i>=0)
6. 高度为h的二叉树至多有2^(h+1)-1个结点(h>=0)
7. 对于任何非空二叉树T,如果其叶结点的个数为n0,度数为2的结点的个数为n2,那么n0=n2+1
8. 满二叉树里的叶结点比分支结点多一个
9. 完全二叉树n个结点,高度为h=[log2(n)]不大于的最大整数。

二叉树抽象数据类型

构造;判断非空;获取结点数;获取数据;获得左树;获得右树;遍历迭代器;遍历结点操作

遍历二叉树

两种方式:①深度优先遍历;②宽度优先遍历

深度优先遍历

按照深度优先方式:遍历左子树—->遍历右子树—->访问根节点

宽度优先遍历

按路径长度由近到远地访问结点。也就是按照层次逐层访问树中各结点,与状态空间搜索情况一样,这种遍历不能写成一个递归过程。

二、二叉树的list实现

把二叉树映射到一种分层的list结构,每棵二叉树都有与之对应的list。
不具有通用性,并且实践操作中麻烦。建议类实现二叉树

三、二叉树的类实现

二叉树的类实现也是链接实现:用一个数据单元表示一个二叉树结点,通过子结点链接建立结点之间的联系。只要掌握一个二叉树的根结点,也就掌握了整个二叉树。
如同建立链表:确定结点类,再确定链表的类。

二叉树结点类

递归定义的二叉树操作具有统一的模式,包括两个部分:
①描述对空树的处理,应直接给出结果。
②描述非空树情况的处理:
1. 如何处理根结点(处理根结点数据时,应直接给出结果)
2. 通过递归调用分别处理左、右子树
3. 基于上述三个部分处理的结果得到对整个树的处理结果。

遍历算法

递归定义遍历
宽度优先遍历
非递归的先根序遍历函数

二叉树类

直接基于结点构造的二叉树具有递归的结构,方便递归处理。

哈夫曼树

优先队列

作为缓存结构,优先队列与栈和队列类似,可以将数据元素保存其中,可以访问和弹出。优先队列的特点是存入其中的每项数据都另外赋有一个数值,表示优先程度,称为优先级。

采用树形结构实现优先队列的一种有效技术称为堆。从结构上看,堆就是结点里存储数据的完全二叉树,但堆中数据的存储要满足一种特殊的堆序:任一结点里所存的数据按照序先于或等于其子结点里的数据。

本章总结

树形结构是典型的递归结构,采用递归的方式可以比较简洁自然的描述树形结构操作和处理方法。也能借助栈或队列辅助结构,写出非递归算法。
实际上,树遍历也就是一种状态空间搜索。树的深度优先处理过程对应于状态空间的深度优先搜索,树的宽度优先处理过程对应于状态空间的宽度优先搜索。
二叉树和树有多种应用,表达式树,堆和优先队列、哈夫曼树,及算法


………………………祝贺三星夺冠……………………^_^!!