当前位置:文档之家› 非线性结构

非线性结构

定的规律走遍树的每一个结点,使每个结点被访问一次 而且只被访问一次。
任何一棵二叉树都由三部分组成:即根结点(记作 D)、左子树(记作L)、右子树(记作R)。这样遍历 一棵二叉树的次序有六种:DLR、LDR、LRD、DRL、 RDL、RLD。如果限定左右子树的访问是先左后右,则 只有三种:
DLR(先序遍历) LDR(中序遍历) LRD(后序遍历)
二叉树的先序遍历算法
void preorder (bnode *BT)
{ if (BT= =NULL)
return;
else
{ visite (BT);
/*访问BT指向的根结点*/
if (BT->LC != NULL) preorder (BT->LC);
if (BT->RC != NULL) preorder (BT->RC);
二叉树的存储方式分为顺序存储和链式存储两种。 顺序存储方式是把二叉树的所有结点按照一定的次序存
储到一片连续的存储单元中,实际上就是把二叉树这种 非线性结构线性化。
对于满二叉树和完全二叉树具有性质:对于有n个
结点的满二叉树和完全二叉树,如果从上至下和从左 至右的顺序对二叉树中的所有结点从1开始顺序编号, 则对于任意序号i的结点有: (1)如果i>1,则序号为i的结点的父结点的序号为i/2
G
D
E
F
G
H I JK
L
非完全二叉树
(3)二叉排序树:它或者是空二叉树,或者是具有如
下性质的二叉树:左子树上所有结点的关键字均小于 根结点的关键字;右子树上所有结点的关键字均大于 等于根结点的关键字。左子树和右子树本身又各是一 棵二叉排序树。
8
4
10
1
4
9
17
1
6
12
二叉排序树
二、二叉树的存储结构
(8)结点的层次 根结点的层次为1,其他任何的层等于它的 父结点的层数加1。
(9)树的深度 一棵树中,结点的最大层次值就是树的深度。 图所示的树的深度为4。
(10)有序树和无序树 如果一棵树中结点的各子树从左到右 是有序的,即若交换了某结点各子树的相对位置则构成了不同 的树,称这棵树为有序树,反之则为无序树。
A A
B,C, D,E
F,G
A
B F,G
C
D,
E
A
B F,G
C
D
B
C
D
F G
E
E
五、二叉排序树的生成
前面已给出了二叉排序树的定义,从二叉 排序村的定义可以得出二叉排序树的一个重要性 质:按中序遍历该树所得的中序序列是一个递增 有序列,因此,二叉排序树常用于对数据排序。 利用二叉排序树来组织数据,可以减少数据查找 次数,提高效率。
后序遍历的递归定义为:
若二叉树为空,遍历结束,否则: (1)按后序遍历方式遍历根结点的左子树; (2)按后序遍历方式遍历根结点的右子树; (3)访问根结点;
二叉树的后序遍历算法
void postorder (bnode *BT)
{ if (BT= =NULL)
return;
else
{ if (BT->LC != NULL) postorder (BT->LC);
在树中,一个结点元素常简称结点,采用递归 方式定义树结构,揭示出树的固有特性。实际上, 树中的每个结点都是该树中某一子树的根。
Root A
第一层
B
C
D
第二层
E
F
G
H
I
第三层
第四层
J
(1)叶子 没有后继的结点称为叶子(或终端端结点),图1.23 中的结点D、E、F、G、H、J为终端结点;
(2)分支结点 非叶子结点称为分支结点 (或:非终端结点)。 (3)结点的度 一个结点的子树数目称为该结点的度。B的度为2,
(取整);如果i=1,则结点是根结点,无父结点;
(2)如果2i≤n,则序号为i的结点的左子结点的序号为2i ; (3)如果2i+1≤n,则序号为i的结点的右子结点的序号为2i
+1; 满二叉树和完全二叉树中结点的序号可以唯一地反应出结点之 间的逻辑关系。
ABCDE FGH I J KL 结点序号 1 2 3 4 5 6 7 8 9 10 11 12
例6 已知一棵二叉树的先序遍历序列为ABCDEFGHIJ.中 序遍历序列为CBDEAFHIGJ,试构造这棵二叉树。构造过 程由图示如下:
A
A
B
F
C,B, F,H,I
D,E
G,L
A
C
D,
H,I
E
G,L
A
B
F

C
D
G
E H, J I
B
F
C
D
G
EH
J
I
练习:已知一棵二叉树的先序遍历序列为ABCDEFG.中序 遍历序列为CBEDAFG,试构造这棵二叉树。
根据以上二叉树的递归定义,可以知道,二叉树可 以为空集,或者只有根结点左右子树为空,或者只有左 子树或右子树,或者左右子树都存在。二叉树的五种形 态如下图所示。
空二叉树
仅有一个结 点的二叉树
根的左子树非空根的 右子树为空的二叉树
根的左子树为空根的 右子树非空的二叉树
根的左右子树皆 为非空的二叉树
一般树与二叉树在概念上的区别
树结构非常类似于自然界中的树,也有树根、树 叶及联系它们的支干。不过这里指的树结构是一种 倒生树,可以用递归的方式定义如下:
树是一个或多个结点元素组成的有限集合T,且 满足如下条件:
(1)有一个特定的结点元素,称为根结点Root;
(2)其余结点元素分成m个(m>0)互不相交 的有限集T1,T2,…,Tm,其中每个集又都是一棵 树,这些树称为Root的子树。
§1.3 非线性结构
非线性结构的逻辑特征是一个结点元素可能 有多个直接前趋和多个直接后继。最主要的非线 性结构是树结构和图结构。
1.3.1树结构及其基本概念
树结构是一类重要的非线性结构。树结构是 结点之间有分支、层次关系的结构,在客观世界 中,树结构是大量存在的,例如家谱、行政组织 机构都可用树形象地表示。在计算机领域中,树 结构也被广泛应用,如计算机磁盘文件的管理, 是一种从根目录到各级子目录的分层结构i在数据 库系统中,常采用树来组织数据信息。
由给定的数据序列生成二叉排序树的过程是 在k2,二…叉,排k序n}树,上先插设入一结棵点空的二过叉程排:序对树一,序然列后{将k1序, 列中的元素顺次生成结点后逐个插入。插入步骤 如下:
第一步:k1作为二叉排序树的根。 第二步:若k2<k1,则k2所在结点应插人到k1的 左子树 上;否则,插入到k1的右子树上。 第三步:读入ki, ki < k1 (根),则进入左子树,否则 进入右子树,继续与子树之根比 较,直到某结点kj,若 有ki < kj且结点kj的左子树为空,则结点ki 插入到结点kj 的左子树;
LC Data Parent RC
右指针域,指向结点的右子树根
父节点指针域 数据域
左指针域,指向结点的左子树根
A
A^
A^ ^
B
C
D
B
^ C^
D
B
^C ^
D
E
F
^ E^
^ F^
^E ^ ^F ^
(a) 二叉树
(b) 二叉链 表结构
(c) 三叉链表结构
一棵二叉树的链式存储结构
三、二叉树的遍历
遍历是树结构的基本操作。树遍历的含义是指用一
若有ki>kj且结点kj的右子树为空,则结点ki插入到 结点kj的右子树。
例7有15个数构成的序列{190,381,12,40,410,394, 540,760,85,476,800,146, 9,445,600},根据算 法的基本思想构造一个二叉排序树。生成过程如图所示。
}
}
中序遍历的递归定义为:
若二叉树为空,遍历结束,否则: (1)按中序遍历方式遍历根结点的左子树; (2)访问根结点; (3)按中序遍历方式遍历根结点的右子树;
二叉树的中序遍历算法
void inorder (bnode *BT) { if (BT= =NULL) return; else { if (BT->LC != NULL) inorder (BT->LC); visite (BT); /*访问BT指向的根结点*/ if (BT->RC != NULL) inorder (BT->RC); } }
设二叉树的存储结构为二叉链表,其结点的类型定 义如下:
typedef struct btreenod { elemtype data; struct btreenode *LC; struct btreenode *RC; } bnode;
bnode *BT;
1、先序遍历:
先序遍历的递归定义为: 若二叉树为空,遍历结束,否则: (1)访问根结点; (2)按先序遍历方式遍历根结点的左子树; (3)按先序遍历方式遍历根结点的右子树;
1
B
C
2
3
D
E
F
G
4
5
6
7
H I J KL M N O
8 9 10 11 12 13 14 15
(2)完全二叉树: 在一棵二叉树中,如果至多只有
最下面两层上的结点的度数可以小于2,并且最下一层
的结点都集中在该层最左边的若干位置上,则此二 叉树称为完全二叉树。
A
A
B
C
B
C
D
E
F
H I JKL
完全二叉树
第一步:从先序遍历序列中取出第一个结点,该结点一 定是二叉树的根。然后在中序遍历序列中找出根结点, 根结点前面的结点序列就是左子树的中序遍历序列,根 结点后面的结点序列就是右子树的中序遍历序列。
相关主题