数据结构高级树形结构教程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

A B
h
2018年11月13日星期二
-1
A
C B -1 D h + 1
-2
0
C E h h
B
D h E + 1 h (c)
0
E h h (a)
A
C
h
12
(b)
右单旋转 (RotateRight )
void AVLTree<Type>:: Rotateright ( AVLNode<Type> *Tree, AVLNode<Type> * &NewTree) { //右单旋转的算法 NewTree = Tree→left; Tree→left = NewTree→right; NewTree→right = Tree; }
2
2018年11月13日星期二
2018年11月13日星期二
3
特点



在第0层,所有的关键码根据它们第0位字符, 被划分 到互不相交的27个类中。 因此,root→brch.link[i] 指向一棵子Trie树,该子Trie 树上所包含的所有关键码都是以第 i 个英文字母开头。 若某一关键码第 j 位字母在英文字母表中顺序为 i ( i = 0, 1, , 26 ), 则它在Trie树的第 j 层分支结点中从第 i 个指针向下找第 j+1 位字母所在结点。当一棵子Trie 树上只有一个关键码时,就由一个元素结点来代替。 在这个结点中包含有关键码,以及其它相关的信息, 如对应数据对象的存放地址等。
5
2018年11月13日星期二
平衡树AVL树 高度平衡的二叉搜索树
AVL树的定义:一棵AVL树或者是空树,或者是具有下列性质 的二叉搜索树:它的左子树和右子树都是AVL树,且左子树 和右子树的高度之差的绝对值不超过1。
高度不平衡的二叉搜索树
2018年11月13日星期二
高度平衡的二叉搜索
6
结点的平衡因子 (balance factor)
2018年11月13日星期二
11
右单旋转 (RotateRight )



在左子树D上插入新结点使其高度增1,导致结点A的平衡因 子增到 -2,造成了不平衡。 为使树恢复平衡,从A沿插入路径连续取3个结点A、B和D, 它们处于一条方向为“/”的直线上,需要做右单旋转。 以结点B为旋转轴,将结点A顺时针旋转。
2018年11月13日星期二
右单旋转
左单旋转
左右双旋转
右左双旋转
9
平衡化旋转



如果在子树 E中插入一个新结点,该子树高度增 1导致结点 A 的平衡因子变成+2,出现不平衡。 沿插入路径检查三个结点A、C和E。它们处于一条方向为“\” 的直线上,需要做左单旋转。 以结点C为旋转轴,让结点A反时针旋转。 +1
A
0
+2
A
+1
C
C h + 1 E B h A
0
B
h D h
2018年11月13日星期二
C
E h
B h D h (b)
E D h + h 1 (c)
10
(a)
左单旋转 (RotateLeft )
void AVLTree<Type> :: RotateLeft( AVLNode<Type> *Tree, AVLNode<Type> * &NewTree ) { //左单旋转的算法 NewTree = Tree→right; Tree→right = NewTree→left; NewTree→left = Tree; }

每个结点附加一个数字,给出该结点右子树的高度减 去左子树的高度所得的高度差。这个数字即为结点的 平衡因子balance 。 根据AVL树的定义,任一结点的平衡因子只能取 -1,0 和 1。 如果一个结点的平衡因子的绝对值大于1,则这棵二叉 搜索树就失去了平衡,不再是AVL树。 如果一棵二叉搜索树是高度平衡的,它就成为 AVL树。 如果它有 n 个结点,其高度可保持在O(log2n),平均搜 索长度也可保持在O(log2n)。
7



2018年11月13日星期二
平衡化旋转树中插入一个新结点, 造成了不平衡。此时必须调整树的结构,使之平 衡化。 平衡化旋转有两类:


单旋转 (左旋和右旋) 双旋转 (左平衡和右平衡)


每插入一个新结点时,AVL树中相关结点的平衡状 态会发生改变。因此,在插入一个新结点后,需 要从插入位置沿通向根的路径回溯,检查各结点 的平衡因子(左、右子树的高度差)。 如果在某一结点发现高度不平衡,停止回溯。
8
2018年11月13日星期二
平衡化旋转



从发生不平衡的结点起,沿刚才回溯的路径取直接下两 层的结点。 如果这三个结点处于一条直线上,则采用单旋转进行平 衡化。单旋转可按其方向分为左单旋转和右单旋转,其 中一个是另一个的镜像,其方向与不平衡的形状相关。 如果这三个结点处于一条折线上,则采用双旋转进行平 衡化。双旋转分为先左后右和先右后左两类。
2018年11月13日星期二
13
先左后右双旋转 (RotationLeftRight)




在子树 F或 G中插入新结点,该子树的高度增 1 。 结点A的平衡因子变为 -2,发生了不平衡。 从结点A起沿插入路径选取3个结点A、B和E,它 们位于一条形如“”的折线上,因此需要进行先 左后右的双旋转。 首先以结点E为旋转轴,将结点B反时针旋转,以 E代替原来B的位置,做左单旋转。 再以结点E为旋转轴,将结点A顺时针旋转,做右 单旋转。使之平衡化。
数据结构:高级树形结构
Data Structure 主讲教师:骆嘉伟
Office number:软件院503 E-mail: luojiawei@
2018年11月13日星期二
1
Trie结构
当关键码是可变长时,Trie树是一种特别有用的索引 结构。
Trie树的定义


Trie树是一棵度 m 2 的树,它的每一层分支不是靠 整个关键码的值来确定,而是由关键码的一个分量 来确定。 如下图所示Trie树,关键码由英文字母组成。它包 括两类结点:元素结点和分支结点。元素结点包含 整个key数据;分支结点有27个指针,其中有一个空 白字符‘b’,用来终结关键码;其它用来标识‘a’, ‘b’,..., ‘z’等26个英文字母。
4
2018年11月13日星期二
Trie树的搜索


函数 Search 设定 current = NULL, 表示 不指示任何一个分支结点, 如果 current 指向一个元素结点 elem,则 current→elem.key 是 current 所指结点中 的关键码。 为了在Trie树上进行搜索,要求把关键码 分解成一些字符元素, 并根据这些字符向 下进行分支。
相关文档
最新文档