数据结构(C语言版)第7章_二叉树

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构李云清杨庆红揭安全人民邮电出版社高等学校精品课程省级国家十二五规划教材高等学校精品课程省级国家十二五规划教材揭安全jieanquan163com江西师范大学计算机信息工程学院第77章二叉树第第7章章二叉树?二叉树的基本概念?二叉树的存储结构?二叉树其它运算的实现?穿线二叉树?树森林和二叉树的转换?二叉树的遍历71二叉树的基本概念abedchfg二叉树的定义为
root=0
(b) 二叉树的顺序存储
退出
一般二叉树顺序存储数据结构的定义如下: #define MAXSIZE 20 ; / *结点值的类型*/ typedef char datatype datatype; /* typedef struct { datatype data; ; int lchild,rchild lchild,rchild; } node; / *二叉树结点的类型*/ /* node tree[MAXSIZE]; / *树中实际所含结点的个数*/ int n; /* int root; / *存放根结点的下标*/ /*
(d)
(e)
图7.1 二叉树的五种基本形态
(a)空二叉树 (b)仅有根结点的二叉树 (c)右子树为空的二叉树 (d)左子树为空的二叉树 (e)左右子树为不空的二叉树
退出
树型结构中使用的术语如父母(双亲或前件)、 子女(后件)、祖先、子孙、兄弟和路径等在二叉树 中仍然可以沿用,但值得注意的是,二叉树并非一般 树型结构的特殊形式,它们为两种不同的数据结构。 二叉树与一般树型结构的主要区别在于: (1)二叉树中每个非空结点最多只有两个子女,而 一般的树型结构中每个非空结点可以有0到多 个子女; (2)二叉树中结点的子树要区分左子树和右子树, 即使在结点只有一棵子树的情况下也要明确指 出是左子树还是右子树。
退出
二叉树具有以下重要性质: 性质1 一棵非空二叉树的第i层上至多有2i-1个结点 (i≥1)。 证明:当i=1时,只有根结点,此时21-1=20=1,显 然上述性质成立;又由于在二叉树中每个结点最多 只能具有两个子女,因而第i层上结点的最大个数是 第i-1层上结点的最大个数的两倍。于是第2层上结 点的最大个数为2,第3层上结点的最大个数为 ,则第i层上结点的最大个数即为2i-1。 4,…… ……,
(b)完全二叉树的顺序存储
退出
2 一般二叉树的顺序存储
由于二叉树中每个结点最多只有两个子女,于 是存储一个结点时,除了包含结点本身的属性值外, 另外增加两个域,分别用来指向该结点的两个子女在 数组中的下标。
a b d f (a) e g 一棵二叉树 c
lchild data rchild 0 1 a 2 1 3 b 4 2 -1 c -1 3 -1 d -1 4 5 e 6 n=7 5 -1 f -1 6 -1 g -1
退出
1 、完全二叉树的顺序存储
对于一棵具有n个结点的完全二叉树,我们可以 按从上到下、同一层次按从左到右的顺序依次将结点 存入一个一维数组中。根据上述性质4,无须附加任 何其它信息就能根据每个结点的下标找到它的子女结 点和双亲结点。
a b d e
f
0 c
1
2
3
4
5
6
7
a
b
c d
e
f
(a) 完全二叉树
退出
链式存储方式下带双亲指针的二叉树结点数据结构 的定义如下: ; / *结点属性值的类型*/ typedef char datatype datatype; /* *二叉树结点的类型*/ typedef struct node{ / /* datatype data; struct node *lchild , *rchild ; lchild, rchild; *指向双亲的指针*/ struct node *parent;/ parent;/* ; } bintnode bintnode; typedef bintnode *bintree ; bintree; bintree root; / *指向二叉树根结点的指针*/ /*
退出
7.4.2 二叉树遍历的递归实现 由于二叉树的遍历是递归定义的,因此采用递 归方式实现二叉树遍历的算法十分方便,只要按照 各种遍历规定的次序,访问根结点时就输出根结点 的值,访问左子树和右子树时进行递归调用即可。 1 、前序遍历二叉树的递归算法 void preorder(bintree t) { if (t) { printf("%c",t ->data); printf("%c",t->data); -> lchild ); preorder(t preorder(t-> ->lchild lchild); rchild ); preorder(t-> preorder(t->rchild rchild); } }
退出
7.2 二叉树的基本运算
ADT bintree { 数据对象D:D是具有相同性质的数据元素构成的集合。 数据关系R:如果D为空或D仅含一个元素,则R为 空; 否则D中存在一个特殊的结点root,称之为根结 点其无前驱;其它结点被分成互不相交的两个集合,分 别构成root的左子树l和右子树r;若l和r非空,则它们 的根结点lroot和rroot分别称为整棵二叉树根结点root 的后继结点;左子树l和右子树r也是二叉树,因而它们 中数据元素间的关系也同样满足R的定义。
退出
带双亲指示的二叉树顺序存储数据结构的定义如下: #define MAXSIZE 20 ; / *结点值的类型*/ typedef char datatype datatype; /* typedef struct { datatype data; ; int lchild,rchild lchild,rchild; parent; / *存放双亲结点的下标*/ int /* } node; / *二叉树结点的类型*/ /* node tree[MAXSIZE]; / *树中实际所含结点的个数*/ int n; /* int root; / *存放根结点的下标*/ /*
高等学校精品课程
(第2版)
李云清
杨庆红 揭安全
人民邮电出版社
江西省高等学校精品课程
揭安全
E_mail: jieanquan@ 江西师范大学计算机信息工程学院
上机作业

完成书中算法6.5 6.6的括号和层号转换
退出
第7章 二叉树
�二叉树的基本概念 �二叉树的存储结构 �二叉树的遍历 �二叉树其它运算的实现 �穿线二叉树 �树、森林和二叉树的转换
退出
若对深度相同的满二叉树和完全二叉树中的所 有结点按自上而下、同一层次按自左向右的顺序依 次编号,则两者对应位置上的结点编号应该相同。 对于完全二叉树,具有以下性质:
退出
性质4 对于具有n个结点的完全二叉树,如果按照从 上到下、同一层次上的结点按从左到右的顺序对二叉 树中的所有结点从1开始顺序编号,则对于序号为i的 结点,有: (1)如果i>1,则序号为i的结点其双亲结点的序号 为⎣i/2⎦ (⎣i/2⎦表示对i/2的值取整);如果 i=1, 则结点i为根结点,没有双亲; (2)如果2i>n,则结点i无左子女(此时结点i为终 端结点);否则其左子女为结点2i; (3)如果2i+1>n,则结点i无右子女;否则其右子 女为结点2i+1。
退出
7.3.2 链式存储结构
二叉树的链式存储方式下每个结点也包含三个 域,分别记录该结点的属性值及左、右子树的位置。 与顺序存储结构不同的是,其左、右子树的位置不是 通过数组的下标,而是通过指针方式体现,如下图所 示: lchild 指针域 data 属性值 rchild 指针域
退出
a b d f e
退出
7.1 二叉树的基本概念
二叉树的定义为:二叉树是一个由结点构成的有 限集合,这个集合或者为空,或者由一个根结点及两 棵互不相交的分别称作这个根的左子树和右子树的二 叉树组成。当二叉树的结点集合为空时,称为空二叉 树 。 a b d h
退出
c e f g
二叉树有以下五种基本形态:
(a)
(b)
(c)
三种遍历方法特点: 1、前序遍历法: � 前序首点是根结点
下图的前序 下图的前序 a 首点为 尾点是l
下图的中序尾 下图的中序首 � 前序尾点是最右下方叶结点 c 点为 d 点为 2、中序遍历法: � 中序首点是最左下方结点 � 中序尾点是最右下方结点 d i j
退出
a b e k f l c
下图的后序首 点为i 3、后序遍历法: 下图的后序尾 点为a � 后序首点是最左下方叶结点 � 后序尾点是根结点 a b d i j e k f l c
退出
如果一棵二叉树中所有终端结点均位于同一层 次,而其它非终端结点的度数均为2,则称此二叉树 为满二叉树。在满二叉树中,若其深度为h,则其所 包含的结点个数必为2h-1。下图中的二叉树即为一棵 深度为3的满二叉树,其结点的个数为23-1=7。 1 2 4 5 6 3 7
退出
如果一棵二叉树扣除其最大层次那层后即成为一 棵满二叉树,且层次最大那层的所有结点均向左靠 齐,则称该二叉树为完全二叉树。通俗地说,完全二 叉树中只有最下面的两层结点的度数可以小于2,且 最下面一层的结点都集中在该层最左边的若干位置上。 下图所示的二叉树即为一棵深度为3的完全二叉树。 1 2 4 5 6 3
退出
性质2 深度为h的二叉树至多有2h-1个结点(h>1)。 根据性质1,深度为h的二叉树最多具有的结点的个 数为20+21+22+…+2h-1=2h-1。
性质3 对于任何一棵二叉树T,如果其终端结点数为 n0,度为2的结点数为n2,则n0=n2+1。
退出
证明:假设二叉树中总的结点个数为n ,度为1的结 点个数为n1,则有: n=n0+n1+n2 又由于在二叉树中除根结点外,其它结点均 通过一条树枝且仅通过一条树枝与其父母结点相 连,即除根结点外,其它结点与树中的树枝存在一 一对应的关系;而二叉树中树枝的总条数为 n1+2 *n2,因而二叉树总结点的个数为: +2* *n2+1 n=n1+2 +2* 于是有: *n2+1 n0+n1+n2=n1+2 +2* 显然n0=n2+1成立。
Λ
root a
c
b d
Λ
Λ
c
Λ
e
Λ
g
f
Λ Λ
g
Λ
(a)一棵二叉树 (b) 二叉树的链式存储
退出
链式存储方式下二叉树结点数据结构的定义如下: ; / *结点属性值的类型*/ typedef char datatype datatype; /* / *二叉树结点的类型*/ typedef struct node{ /* datatype data; , *rchild ; struct node *lchild lchild, rchild; } bintnode ; bintnode; ; typedef bintnode *bintree bintree; bintree root;
退出
(2)二叉树的中序的左子树;然后 访问根结点;最后按照中序遍历的顺序访问根结点的 右子树。
(3)二叉树的后序遍历
首先按照后序遍历的顺序访问根结点的左子树;然后 按照后序遍历的顺序访问根结点的右子树;最后访问 根结点。
a b d e g
退出
c f
前序遍历:abdefgc 中序遍历:debgfac 后序遍历:edgfbca
退出
7.4 二叉树的遍历
7.4.1 二叉树遍历的定义 所谓二叉树的遍历,是指按一定的顺序对二叉 树中的每个结点均访问一次,且仅访问一次。按照 根结点访问位置的不同,通常把二叉树的遍历分为 三种:前序遍历、中序遍历和后序遍历。 (1)二叉树的前序遍历 首先访问根结点; 然后按照前序遍历的顺序访问根结点的左子树; 再按照前序遍历的顺序访问根结点的右子树。
退出
2 、中序遍历二叉树的递归算法 void inorder(bintree t) { if (t) { inorder(t -> lchild ); inorder(t-> ->lchild lchild); “%c ”,t ->data); printf( printf(“ %c” ,t->data); -> rchild ); } inorder(t inorder(t-> ->rchild rchild); } 3 、后序遍历二叉树的递归算法 void postorder(bintree t) { if (t) { -> lchild ); postorder(t postorder(t-> ->lchild lchild); -> rchild ); postorder(t postorder(t-> ->rchild rchild); ->data); } printf("%c",t printf("%c",t->data); }
退出
7.3 二叉树的存储结构
二叉树常用的存储结构有两种:顺序存储结构 和链式存储结构。
7.3.1 顺序存储结构
顺序存储结构是使用一组连续的空间存储二叉 树的数据元素和数据元素之间的关系。因此必须将二 叉树中所有的结点排成一个适当的线性序列,在这个 线性序列中应采用有效的方式体现结点之间的逻辑关 系。
相关文档
最新文档