DS06数据结构树-二叉排序树.ppt
合集下载
数据结构 二叉排序树[高级课件]
8
(2) 生成二叉排序树的算法:
BiTree crt_bstree(BiTree &root){
//输入一个关键字序列,生成一棵二叉排序树的二叉链表结构
root=NULL; read(x);
while (x≠ 结束标志){
s=(BiTree)malloc(sizeof(BiTNode))
s→key=x ; …… ; //生成新结点 s→lchild =NULL ; s→rchild =NULL; ins_ bstree(root, s); read(x);}
12
(3) 被删除的结点既有左子树,也有右子树
被删关键字 = 50 540
30
80
20
40 某结点的前驱一
定在它的左子树
90
的最右下方
35
85
32
前驱结点
88
被删结点
以其前驱替代之,然后 严选内容再删除该前驱结点 13
5. 二叉排序树的查找分析
比较次数 = 被查结点所在的层次数。 二叉排序树的性能取决于树的形态,而二叉树的 形态取决于插入结点的顺序。
9.4 二叉排序树
1.定义:
二叉排序树(二叉搜索树或二叉查找树) 或者是一棵空树;或者是具有如下特性的二叉树
(1) 若它的左子树不空,则左子树上所有结点的 值均小于根结点的值;
(2) 若它的右子树不空,则右子树上所有结点 的值均大于等于根结点的值;
(3) 它的左、右子树也都严分选内容别是二叉排序树。 1
struct BiTNode *lchild;
struct BiTNode *rchild;
} BiTNode,*BiTree;
严选内容
5
数据结构第6章树和二叉树基本概念和二叉树ppt课件
§6.2 二叉树
❖二叉树的定义
或者是空树,或者是由一个根结点加上两棵 分别称为左子树和右子树的、互不相交的二叉树 组成。
二叉树的结点的子树要区分左子树和右子树, 即使在结点只有一棵子树的情况下也要明确指出 该子树是左子树还是右子树。
§6.2 二叉树
❖二叉树的定义
逻辑结构: 一对二(1:2) 基本特征: ① 每个结点最多只有两棵子树(不存在度大于2的结点) ② 左子树和右子树次序不能颠倒(有序树)。 基本形态:
§6.1 树的基本概念
❖树的基本术语
结点 ——即树的数据元素 结点的度 ——结点挂接的子树数
(有几个直接后继就是几度, 亦称“次数”) 结点的层次 ——从根到该结点的层数(根结点算第一层) 终端结点 ——即度为0的结点,即叶子 分支结点 ——即度不为0的结点(也称为内部结点) 树的度 ——所有结点度中的最大值(Max{各结点的度}) 树的深度 ——指所有结点中最大的层数(Max{各结点的层次}) (或高度)
二叉树的运算仍然是插入、删除、修改、查找、排序等,但这些操 作必须建立在对树结点能够“遍历”的基础上! (遍历——指每个结点都被访问且仅访问一次,不遗漏不重复)。
§6.2 二叉树
❖二叉树的性质
讨论1:第i层的结点数至多是多少? 2i-1个
1
2
3
(二进制性质)
4
5
6
7
8 9 10 11 12 13 14 15
特点:每层都“充满”了结点
§6.2 二叉树
❖两种特殊形式的二叉树
完全二叉树:树中所含的n个结点和满二叉树中编号 为1至n的结点一一对应
(例如删除A后的子树个数) 有序树 ——结点各子树从左至右有序,不能互换(左为第一) 无序树 ——结点各子树可互换位置。
数据结构6章 树、二叉树PPT资料34页
root
A
B
C
B
∧C
D
E
G
(a) 二叉树
∧D ∧
∧E ∧ (b) 链式存储结构
∧G ∧
2020/5/29
6.2.4 声明二叉树类
1.二叉树的结点类
package ds_java; public class TreeNode1 {
public String data; public TreeNode1 left,right; public TreeNode1() {
}
}
2020/5/29
3.按后根次序遍历二叉树的递归 算法
public void postorder(TreeNode1 p)
{
//后根次序遍历二叉树
if(p!=null)
{
postorder(p.left);
postorder(p.right);
depth=3
E
F
G
H
I
J level=3
(a) n=0 空树
(b) n=1 树中只有一个根结点
(c) n=10,度为3的树
2020/5/29
6.1.2 树的术语
1.结点 2.孩子结点与双亲结点 3.兄弟结点 4.结点的度 5.叶子结点与分支结点 6.树的度
7.结点的层次 8.树的深度或高度 9.森林
– 当n>1时,除根结点之外的其他结点分为m(m≥0)个互不相交的集合 T1, T2, …, Tm,其中每个集合Tm(1≤i≤m)本身又是一棵结构与树类 同的子树(subtree)。每棵子树的根结点有且仅有一个直接前驱结点 ,但可以有零或多个直接后继结点。
root
root
数据结构第6章树和二叉树3树和森林ppt课件
§6.4 树和森林 ❖树的存储结构——孩子兄弟表示法
这种存储结构便于实现各种树的操作。首先易于 实现找结点孩子等的操作。如果为每个结点增设一个 (parent)域,则同样能方便地实现Parent(T, x)操作。
§6.4 树和森林
❖森林和二叉树的转换
1. 树和二叉树的对应关系 由于二叉树和树都可用二叉链表作为存储结构,
R AB C
DE
F
GHK
R^
A
^D
^B
^E ^
C^
F^
^G
^H
^K ^
§6.4 树和森林
❖树的二叉链表(孩子 - 兄弟)存储表示
typedef struct CSNode { Elem data; struct CSNode *firstchild , *nextsibling;
} CSNode, *CSTree;
A BC D E F GH
A BC D
E F GH A
BC D
1)在兄弟之间加一条连线; 2)对每个结点,除了左孩子外,去除其与其余孩子之间的联系; 3)以根结点为轴心,将整个树顺时针转45°。
Ia
A B
Ib
E F
d
C D
G H I
c E F G H I
§6.4 树和森林
❖森林和二叉树的转换
2. 森林和二叉树的对应关系 从树的二叉链表表示的定义可知,任何一棵
§6.4 树和森林
3
6^
5^
0
1
7
8
2^ 9^
R AB C
DE
F
GHK
§6.4 树和森林 ❖树的存储结构——孩子兄弟表示法
或称二叉树表示法,或称二叉链表表示法。即以 二叉链表作树的存储结构。链表中结点的两个链域分 别指向该结点的第一个孩子结点和下一个兄弟结点。
二叉树 排序PPT课件
常用算法执行中的数据比较次数和数据移动次数来衡量。
01.12.2020
6
为简单起见,数据的存储结构采用记录数组形式, 同时假定关键字是整数。记录数组的类型说明如下:
Typedef int KeyType typedef struct { KeyType key;
int other; } DataType; DataType R[n];
如:2, 2*,1,排序后若为1, 2*, 2 则该排序方法是不稳 定的。在应用排序的某些场合,如选举和比赛等,对排序 的稳定性是有特殊要求的。
▪内排序与外排序 :排序过程是否全部在内存进行。
(区分标准)
01.12.2020
5
▪ 排序的方法有很多,但简单地判断那一种算法最好,以 便能够普遍选用则是困难的。
比较
while (R[0].key<R[j].key) R[j+1]=R[j- -];
先后移,再j-1
R[ j+1]=R[0];
插入
}
}
01.12.2020
14
R[0]有两个作用:
其一: 是进入查找循环之前,保存 R[i] 的副本,使之不 至于因记录的后移而丢失R[i]中的内容;
其二: 是在 while 循环时,“监视”下标变量 j 是否越 界,一旦 越界(j<1),R[0]自动控制while循环的结束, 从而避免了在while 循环内的每一次都要检测 j 是否越 界( 即省略了循环条件j > -1)。
10
直接插入排序算法
InsertSort(DataType R[],int n) { int i,j;
DataType temp; for (i=0;i<n-1;i++) //n-1次 { temp=R[i+1];
01.12.2020
6
为简单起见,数据的存储结构采用记录数组形式, 同时假定关键字是整数。记录数组的类型说明如下:
Typedef int KeyType typedef struct { KeyType key;
int other; } DataType; DataType R[n];
如:2, 2*,1,排序后若为1, 2*, 2 则该排序方法是不稳 定的。在应用排序的某些场合,如选举和比赛等,对排序 的稳定性是有特殊要求的。
▪内排序与外排序 :排序过程是否全部在内存进行。
(区分标准)
01.12.2020
5
▪ 排序的方法有很多,但简单地判断那一种算法最好,以 便能够普遍选用则是困难的。
比较
while (R[0].key<R[j].key) R[j+1]=R[j- -];
先后移,再j-1
R[ j+1]=R[0];
插入
}
}
01.12.2020
14
R[0]有两个作用:
其一: 是进入查找循环之前,保存 R[i] 的副本,使之不 至于因记录的后移而丢失R[i]中的内容;
其二: 是在 while 循环时,“监视”下标变量 j 是否越 界,一旦 越界(j<1),R[0]自动控制while循环的结束, 从而避免了在while 循环内的每一次都要检测 j 是否越 界( 即省略了循环条件j > -1)。
10
直接插入排序算法
InsertSort(DataType R[],int n) { int i,j;
DataType temp; for (i=0;i<n-1;i++) //n-1次 { temp=R[i+1];
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Aug July
Sept
Oct Dec
Nov
第4章 树
§4.4二叉搜索树
• 对于一个无序序列可以通过构造一棵BST树而变成一个有 序序列。
• 由算法知,每次插入的新结点都是BST树的叶子结点,即 在插入时不必移动其它结点,仅需修改某个结点的指针。
• 利用BST树的插入操作,可以从空树开始逐个插入每个结 点,从而建立一棵BST树.
Tmp = FindMin( BST->Right ); //在右子树中找最小的元素填充删除结点
BST->Data = Tmp->Data;
BST->Right = Delete( BST->Data, BST->Right); //在删除结点的右子树中删除最小元素
} else { //被删除结点有一个或无子结点
return BST; }
代码4.17 查找最大元素的迭代函数
第4章 树
§4.4二叉搜索树
❖ 二叉搜索树的插入
〖分析〗将元素X插入二叉搜索树BST中关键是要找到元素应该插 入的位置。位置的确定可以利用与查找函数Find类似的方法,如果 在树BST中找到X,说明要插入的元素已存在,可放弃插入操作。 如果没找到X,查找终止的位置就是X应插入的位置。
➢ 最大元素一定是在树的最右分枝的端结点上 ➢ 最小元素一定是在树的最左分枝的端结点上
18
最左端点
10
20
7
15
22
9
§4.4二叉搜索树 最右端点
第4章 树
§4.4二叉搜索树
Position FindMin( BinTree BST ) {
if( !BST ) return NULL; //空的二叉搜索树,返回NULL else if( !BST->Left )
return Find( X, BST->Right ); //在右子树中继续查找 else if( X < BST->Data )
return Find( X, BST->Left ); //在左子树中继续查找 else //X == BST->Data
return BST; //查找成功,返回找到结点的地址 }
如果根结点的键值大于X,接下来的搜索将在左子树中进 行;
若两者比较结果是相等,搜索完成,返回指向此结点的指 针。
第4章 树
❖ 二叉搜索树的查找操作Find
§4.4二叉搜索树
Position Find( ElementType X, BinTree BST ) {
if( !BST ) return NULL; //查找失败 if( X > BST->Data )
Jan
Feb
Mar
Apr
June May
Aug
July
Dec
Sept Oct
July
Feb
May
Apr Aug
Aug
Jan
Mar Oct
Apr Dec
June Nov Sept
Nov
深度:㏒2n +1~n
Oct Sept
第4章 树
§4.4二叉搜索树
❖ 二叉搜索树的删除
➢ 二叉搜索树的删除操作比其它操作更为复杂,有三种情况需要考虑:
BST->Left = Insert( X, BST->Left); //递归插入左子树
else if( X > BST->Data ) BST->Right = Insert( X, BST->Right); //递归插入右子树
// else X已经存在,什么都不做 return BST;
}
代码4.18 二叉搜索树的插入算法
第4章 树
❖ 二叉搜索树的查找操作Find
§4.4二叉搜索树
➢ 查找从根结点开始,如果树为空,返回NULL,表示 未找到关键字为X的结点。
➢ 若搜索树非空,则根结点关键字和X进行比较,依据 比较结果,需要进行不同的处理:
若根结点键值小于X,满足条件的结点将不会出现在它的 左子树,接下来的搜索只需在右子树中进行;
优点:查找效率高
缺点:要求线性表有序,如果是进行动态查找,即需要对线性表进行 插入、删除或排序操作,就必须移动大量的记录,当记录数很多时, 这种移动的代价很大。
第4章 树
❖ 11个元素的二分查找判定树
§4.4二叉搜索树
6
3
9
1
4
7 10
2
5
8
11
➢判定树的特点: ➢ 左子树的值都比根结点小 ➢ 右子树的值都比根结点大
➢ 中序遍历判定树得到的是一组有序 的序列
11个元素的判定树
➢能否根据以上特点,利用树型结构来动 态创建查找表呢?
第4章 树
❖二叉搜索树
§4.4二叉搜索树
“二叉搜索树(BST,Binary Search Tree)”也称二叉排序树 或二叉查找树,它是一种对排序和查找都很有用的特殊二叉树。
【定义】一个二叉搜索树是一棵二叉树,它可以为空。如果不为空,
Tmp = BST; if( !BST->Left ) // 有右孩子或无子结点
BST = BST->Right; else if( !BST->Right ) //有左孩子或无子结点
BST = BST->Left;
free( Tmp );
}
return BST;
}
第4章 树
❖二叉树排序树性能
§4.5 平衡二叉树
它将满足以下性质:
1.非空左子树的所有键值小于其根结点的键值。
2.非空右子树的所有键值大于其根结点的键值。
3.左、右子树都是二叉搜索树。
6
18
3
9
30
10
20
15 1
441 7 10
7
5
22
233 5 50 8
11
11个元素二分查找的判定树
第4章 树
§4.4二叉搜索树
❖ 二叉搜索树的动态查找
typedef Position BinTree
Jan
Feb Apr
Mar June May
Aug
July
Dec
Sept Oct
Nov
July
Feb
May
Apr Aug
Aug Jan Apr Dec
Mar Oct June Nov Sept
Oct Sept
第4章 树
§4.5 平衡二叉树
➢ 按ASL的定义,可以分别计算出三棵二叉搜索树的平均查找长度: ASL(a)=(1+2×2+3×3+4×3+5×2+6×1)/12 = 3.5; ASL(b)=(1+2×2+3×4+4×5)/12 = 3.0; ASL(c)=(1+2×1+3×1+4×1+5×1+6×1+7×1+8×1+9×1+10×1+11 ×1+12×1)/12 = 6.5;
第4章 树
§4.4二叉搜索树
【例4.8】以一年十二个月的英文缩写为键值,按从一月到十二月顺序 输入它们,即输入序列为(Jan, Feb, Mar, Apr, May, Jun, July, Aug, Sep, Oct, Nov, Dec),将产生什么样的二叉搜索树?
Jan
FebMarBiblioteka AprJun May
查找二叉搜索树(BST)的时间复杂度(最坏情况下) 用查找过程中的比较次数来衡量,它取决于树的深度。
〖例〗不同的插入次序,将导致不同的深度和平均查找长度ASL。 (a) 按一月到十二月的自然月份序列输入所生成的; (b) 输入序列为(July, Feb, May, Mar, Aug, Jan, Apr, Jun, Oct, Sept, Nov, Dec) (c) 输入序列则是按月份字符串从小到大的顺序排列的。
要删除的是叶结点——可以直接删除,然后再修改其父结点的指针。
〖例〗:删除 35
30
15 要删除结点
41
33
50
35
图4.28 二叉搜索树叶结点的删除
第4章 树
§4.4二叉搜索树
要删除的结点只有一个孩子结点——删除之前需要改变其父结点的
指针,指向要删除结点的孩子结点。
〖例〗:删除 33
30
15
41
else if( X < BST->Data ) BST->Left = Delete( X, BST->Left); // 左子树递归删除
else if( X > BST->Data ) BST->Right = Delete( X, BST->Right); // 右子树递归删除
else //找到要删除的结点 if( BST->Left && BST->Right ) { //被删除结点有左右两个子结点
➢ 二叉搜索树作为抽象数据结构的定义与普通二叉树相同,但操作集 中多了下列几个特别的函数:
Position Find( ElementType X, BinTree BST ):从二叉搜索树BST
中查找元素X,返回其所在结点的地址;
Position FindMin( BinTree BST ):从二叉搜索树BST中查找并返回
• 思考:用上述方法构造的含有n个结点BST树,其深度是多少?
深度:㏒2n +1~n
第4章 树
§4.5 平衡二叉树
〖例〗不同的插入次序,将导致不同的深度。