第六章 树二叉树
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
安徽工程大学计算机与信息学院电子教案
二、二叉树
二叉树的链式存储
第 六 章 树 和 二 叉 树
由于二叉树最多只有两颗子树,因此可以采用二叉 链表形式存储。
Lchild和Rchild是分别指向该结点左孩子和右孩子的指针
安徽工程大学计算机与信息学院电子教案
二、二叉树
二叉树的链式存储定义
第 六 章 树e);
求 e 的右兄弟。若 e 是其双亲的右孩子或无右兄弟, 则返回"空"。
安徽工程大学计算机与信息学院电子教案
二、二叉树
二叉树的操作
第 六 章 树 和 二 叉 树
PreOrderTraverse(T, visit());
先序遍历 T,对每个结点调用函数 visit 。
2
3
4二叉树的总度数=二叉树的节点数-1 5 6
7
n1+2n2=n0+n1+n2-1 即: n0=n2+1
安徽工程大学计算机与信息学院电子教案
二、二叉树
二叉树的性质
第 六 章 树 和 二 叉 树
④
具有n个结点的完全二叉树的深度为 log2n+1
完全二叉树:n个结点的二叉树,若将它与一棵同深度的满二 叉树中的所有结点按从上到下,从左到右的顺序分别进行编 号,且该二叉树中的每个结点分别与满二叉树中编号为1~n 的结点位置一一对应,则称这棵二叉树为完全二叉树 证明:假设具有n个结点的完全二叉树的深度为K,则根据性 质2可以得出: 2K-1-1< n≤2K-1 将不等式两端加1得到: 2K-1≤n<2K 取以2为底的对数,化简: K-1≤log2n<K 得到:log2n =K-1。 整理:K= log2n+1
证明:采用数学归纳法,请大家自行阅读教材
安徽工程大学计算机与信息学院电子教案
二、二叉树
第 六 章 树 和 二 叉 树
二叉树的操作 CreateBiTree(T, definition); 以definition 给出二叉树 T 的定义创建 一棵二叉树 DestroyBiTree(T); 销毁二叉树 T。
安徽工程大学计算机与信息学院电子教案
二、二叉树
二叉树的操作
第 六 章 树 和 二 叉 树
LeftChild(T, e);
求结点e的左孩子,若 e 无左孩子,则返回"空"。
RightChild(T, e); 求结点e的右孩子,若 e 无左孩子,则返回"空"。 LeftSibling(T, e); 求结点 e 的左兄弟。若 e 是其双 亲的左孩子或无左兄弟,则返回"空"。
安徽工程大学计算机与信息学院电子教案
一、树的基本概念
树的有关概念
第 六 章 树 和 二 叉 树
有序树、无序树:如果树中每棵子树从左向右的排列 拥有一定的顺序,不得互换,则称为有序树,否 则称为无序树。 森林:是m(m≥0)棵互不相交的树的集合。 孩子、双亲:结点子树的根称为这个结点的孩子,而 这个结点又被称为孩子的双亲。 子孙:以某结点为根的子树中的所有结点都被称为是 该结点的子孙。 祖先:从根结点到该结点路径上的所有结点。 兄弟:同一个双亲的孩子之间互为兄弟。 堂兄弟:双亲在同一层的结点互为堂兄弟。
安徽工程大学计算机与信息学院电子教案
一、树的基本概念
树的有关概念
第 六 章 树 和 二 叉 树
结点:数据元素的内容及其指向其子树根的分支统称 为结点 结点的度:结点的分支数。 终端结点(叶子) :度为0的结点。 非终端结点 :度不为0的结点。 结点的层次 :树中根结点的层次为1,根结点子树的 根为第2层,以此类推。 树的度:树中所有结点度的最大值。 树的深度:树中所有结点层次的最大值。
安徽工程大学计算机与信息学院电子教案
二、二叉树
二叉树的操作
第 六 章 树 和 二 叉 树
ClearBiTree(&T); 将二叉树 T 清为空树。 InsertChild(&T, p, LR, c); 根据 LR 为 0 或 1,插入 c 为 T 中 p 所指结点的左或 右子树。p 所指结点原有左或右子树成为 c 的右子树。 DeleteChild(&T, p, LR); 其他衍生操作
安徽工程大学计算机与信息学院电子教案
二、二叉树
二叉树的遍历
第 六 章 树 和 二 叉 树
先序遍历: A B D G C E F H
先序遍历: ABDGCEFH
安徽工程大学计算机与信息学院电子教案
二、二叉树
二叉树的遍历
第 六 章 树 和 二 叉 树
中序遍历: D G B A E C H F
层次遍历: A B C D E F G H
层次遍历: GDBEHFCA
安徽工程大学计算机与信息学院电子教案
二、二叉树
第 六 章 树 和 二 叉 树
二叉树的先序遍历 算法思想:判断二叉树是否为空? 若为空,则结束遍历;否则先访问根; 再先序遍历根的左子树; 最后先序遍历根的右子树 void PreOrder ( BitTree t ) { if ( t )
安徽工程大学计算机与信息学院电子教案
二、二叉树
二叉树的遍历
第 六 章 树 和 二 叉 树
定义:按照一定规则访问二叉树的所有节点一次。 根据根结点和左右子树访问的先后不同,有四类七 种遍历操作。 先序遍历:TLR或者TRL 中序遍历:LTR或者RTL 后序遍历:LRT或者RLT 层次遍历:从上到下, 从左到右 依次访问结点
二、二叉树
二叉树的性质
第 六 章 树 和 二 叉 树
① ②
在二叉树的第i层上最多有2i-1个结点(i≥1) 深度为K的二叉树最多有2K-1个结点(K≥1) ( 称为满二叉树) 1 ③ 对于任意一棵二叉树,如果度为0的结点个数为n0,度为2 的结点个数为n2,则n0=n2+1 二叉树的总度数=n1+2n2 二叉树的节点数=n0+n1+n2
typedef struct bnode { DataType data; struct bnode *lchild, *rchild; } Bnode,*BitTree; 二叉树的链式存储结构类似线性表的双向链表存在两个指针, 分别指向其左右子树,而非双向链表的前驱和后继。 链式结构可以根据二叉树的结点数来动态分配存储空间, 解决了顺序存储结构的问题,因此常用的二叉树采用二叉 链表的形式比较多。 根据操作的不同可以对二叉树进行改进,如:考虑求双亲(前 驱)操作时可以采用什么形式?
当n=0时,称为空二叉树;当n>0时,有且仅 有一个结点为二叉树的根,其余结点被分成 两个互不相交的子集,一个称为左子集,另 一个称为右子集,每个子集又是一个二叉树 。
安徽工程大学计算机与信息学院电子教案
二、二叉树
二叉树的基本形态
第 六 章 树 和 二 叉 树
安徽工程大学计算机与信息学院电子教案
if ( t ) { InOrder ( t->lchild ); /* 遍历左子树 */ visite (t->data); /* 访问结点内容 */ InOrder ( t->rchild ); /* 遍历右子树 */ }
安徽工程大学计算机与信息学院电子教案
第 六 章 树 和 二 叉 树
数据结构的树型结构
树和二叉树
安徽工程大学计算机与信息学院电子教案
第六章 树和二叉树
第 六 章 树 和 二 叉 树
【教学目的】掌握树的基本概念,二叉树的基本概念,二 叉树的逻辑结构、存储结构以及二叉树的操作的实现;掌 握二叉树与树和森林的转换,进而掌握树和森林的存储结 构,利用二叉树解决Huffman编码的应用 【教学重点】二叉树的概念、二叉树的递归与非递归遍历 算法、线索化、二叉树与树、森林的转换,Huffman树及 Huffman编码 【教学难点】二叉树的非递归遍历及线索化、Huffman树
安徽工程大学计算机与信息学院电子教案
二、二叉树
第 六 章 树 和 二 叉 树
二叉树的操作 BitTreeEmpty(T); 初始条件:二叉树 T 存在。 操作结果:若T为空二叉树,则返回 TRUE,否则返回 FALSE。 Visit(e); 访问e结点。 Parent(T, e); 求e结点的双亲结点,若e是T的非根结 点,则返回它的双亲,否则返回"空"。
安徽工程大学计算机与信息学院电子教案
一、树的基本概念
树的几种形态
第 六 章 树 和 二 叉 树
安徽工程大学计算机与信息学院电子教案
一、树的基本概念
第 六 章 树 和 二 叉 树
树的特点(逻辑结构) (1)树的根结点没有前驱结点,除根结点之 外的所有结点有且只有一个前驱结点 (2)树中所有结点可以有零个或多个后继结 点
根据 LR 为 0 或 1,删除 T 中 p 所指结点的左或右子树。
安徽工程大学计算机与信息学院电子教案
二、二叉树
第 六 章 树 和 二 叉 树
二叉树的顺序存储 回忆性质⑤,完全二叉树
安徽工程大学计算机与信息学院电子教案
二、二叉树
二叉树的顺序存储定义
第 六 章 树 和 二 叉 树
#define MaxTreeNodeNum 100 typedef struct { DataType data[MaxTreeNodeNum]; /* 根存储在下标为1的数组单元中 */ int n; /* 当前完全二叉树的结点个数 */ }QBTree; 二叉树是完全二叉树时,没有问题。但是如果是非完全二叉树 怎么办? 方法:将非完全二叉树以特殊值填充成完全二叉树形式。 新的问题:若为完全二叉树,空间利用率高、寻找孩子和双亲 比较容易。若不是完全二叉树,造成空间利用率的下降。
安徽工程大学计算机与信息学院电子教案
二、二叉树
二叉树的性质
第 六 章 树 和 二 叉 树
⑤
对于有n个结点的完全二叉树中的所有结点按从上到下, 从左到右的顺序进行编号,则对任意一个结点i (1≤i≤n),有: 如果i=1,则结点i是这棵完全二叉树的根,没有双亲;否 则其双亲结点的编号为 i/2。 如果2i>n,则结点i没有左孩子;否则其左孩子结点的编 号为2i。 如果2i+1>n,则结点i没有右孩子;否则其右孩子结点的 编号为2i+1。
中序遍历: DGBAECHF
安徽工程大学计算机与信息学院电子教案
二、二叉树
二叉树的遍历
第 六 章 树 和 二 叉 树
后序遍历: G D B E H F C A
后序遍历: GDBEHFCA
安徽工程大学计算机与信息学院电子教案
二、二叉树
二叉树的遍历
第 六 章 树 和 二 叉 树
安徽工程大学计算机与信息学院电子教案
一、树的基本概念
第 六 章 树 和 二 叉 树
树的表示方法
直观表示法 嵌套集合表示法 凹入表示法 //不清晰 广义表表示法
① ② ③ ④
④
② ①
③
安徽工程大学计算机与信息学院电子教案
二、二叉树
定义:叉树是n(n≥0)个结点的有限集合。
第 六 章 树 和 二 叉 树
{ visite (t->data); /* 访问结点内容 */ PreOrder ( t->lchild ); /* 遍历左子树 */ PreOrder ( t->rchild ); /* 遍历右子树 */
}
}
安徽工程大学计算机与信息学院电子教案
二、二叉树
第 六 章 树 和 二 叉 树
二叉树的中序遍历 算法思想:判断二叉树是否为空? 若为空,则结束遍历; 否则先中序遍历根的左子树; 再访问根;最后中序遍历根的右子树 void InOrder ( BitTree t ) {
InOrderTraverse(T, vsit()); 中序遍历 T,对每个结点调用函数 Visit。 PostOrderTraverse(T, visit()); 后序遍历 T,对每个结点调用函数 visit。
LevelOrderTraverse(T, visit());
层序遍历 T,对每个结点调用函数 visit 。
安徽工程大学计算机与信息学院电子教案
第六章 树和二叉树
本章的主要内容
第 六 章 树 和 二 叉 树
一、树的基本概念 二、二叉树 三、树和森林 四、哈夫曼树
安徽工程大学计算机与信息学院电子教案
一、树的基本概念
定义:是一种常非线性结构树是n(n≥0)
第 六 章 树 和 二 叉 树
个结点的有限集合。若n=0,则称为空树; 否则,有且仅有一个特定的结点被称为根, 当n>1时,其余结点被分成m(m>0)个互 不相交的子集T1,T2,...,Tm,每个子集 又是一棵树