avl树例题

合集下载

AVL树的平衡算法(JAVA实现)

AVL树的平衡算法(JAVA实现)

AVL树的平衡算法(JAVA实现)1、概念: AVL树本质上还是⼀个⼆叉搜索树,不过⽐⼆叉搜索树多了⼀个平衡条件:每个节点的左右⼦树的⾼度差不⼤于1。

⼆叉树的应⽤是为了弥补链表的查询效率问题,但是极端情况下,⼆叉搜索树会⽆限接近于链表,这种时候就⽆法体现⼆叉搜索树在查询时的⾼效率,⽽最初出现的解决⽅式就是AVL树。

如下图:2、旋转 说到AVL树就不得不提到树的旋转,旋转是AVL维持平衡的⽅式,主要有以下四种类型。

2.1、左左旋转 如图2-1所⽰,此时A节点的左树与右树的⾼度差为2,不符合AVL的定义,此时以B节点为轴⼼,AB间连线为转轴,将A节点旋转⾄B节点下⽅,由B节点的⽗节点变成⼦节点。

实现所有节点的左右⼦树⾼ 度差⼩于等于1。

如图2-2。

2.2、右右旋转 右右旋转与左左旋转类似,但是动作相反,如图2-3,2-4所⽰,以B节点为轴⼼,BC间连线为轴,将C节点旋转⾄B下⽅,成为B的⼦节点。

实现所有节点的左右⼦树⾼度差⼩于等于1。

2.3、左右旋转 左右旋转稍复杂⼀点,需要旋转两次,如果⽤左左旋转的⽅式直接旋转图2-5中的树,会变成图2-8的样⼦,此时B节点的左右⼦树⾼度差依然没有平衡,所以要先对2-5的树做⼀步处理,就是以BC为轴, 将C节点旋转⾄B节点的位置,如图2-6所⽰,此时就将树转换成了左左旋转的场景,之后使⽤左左旋转即可完成平衡。

2.4、右左旋转 右左旋转与左右旋转类似,也是旋转两次。

如下图,具体细节请看下⾯的代码详解。

3、代码实现 3.1、新增 ⼆叉树的插⼊不在赘述,这⾥只分析插⼊时的平衡⽅法。

如果新增节点没有兄弟节点时会引起树的⾼度变化,此时需要对上层节点的平衡值进⾏修改,如果出现了不平衡树,则需要调⽤平衡⽅法,代码如下:private void balance(Node node){Node parent = node.getParent();Node node_middle = node;Node node_prev = node;Boolean avl = true;do{if(node_middle == parent.getLeft() && (-1 <= parent.getAVL()-1 && parent.getAVL()-1 <= 1)){//node_middle为parent的左树,此时parent左树⾼度+1不会造成不平衡。

数据结构试题及答案(1)

数据结构试题及答案(1)

数据结构试题一、单选题1、在数据结构的讨论中把数据结构从逻辑上分为(C )A 内部结构与外部结构B 静态结构与动态结构C 线性结构与非线性结构D 紧凑结构与非紧凑结构。

2、采用线性链表表示一个向量时,要求占用的存储空间地址(D )A 必须是连续的B 部分地址必须是连续的C 一定是不连续的D 可连续可不连续3、采用顺序搜索方法查找长度为n的顺序表时,搜索成功的平均搜索长度为( D )。

A nB n/2C (n-1)/2D (n+1)/24、在一个单链表中,若q结点是p结点的前驱结点,若在q与p之间插入结点s,则执行( D )。

A s→link = p→link; p→link = s;B p→link = s; s→link = q;C p→link = s→link; s→link = p;D q→link = s; s→link = p;5、如果想在4092个数据中只需要选择其中最小的5个,采用( C )方法最好。

A 起泡排序B 堆排序C 锦标赛排序D 快速排序6、设有两个串t和p,求p在t中首次出现的位置的运算叫做( B )。

A 求子串B 模式匹配C 串替换D 串连接7、在数组A中,每一个数组元素A[i][j]占用3个存储字,行下标i从1到8,列下标j从1到10。

所有数组元素相继存放于一个连续的存储空间中,则存放该数组至少需要的存储字数是( C )。

A 80B 100C 240D 2708、将一个递归算法改为对应的非递归算法时,通常需要使用( A )。

A 栈B 队列C 循环队列D 优先队列9、一个队列的进队列顺序是1, 2, 3, 4,则出队列顺序为( C )。

10、在循环队列中用数组A[0..m-1] 存放队列元素,其队头和队尾指针分别为front和rear,则当前队列中的元素个数是( D )。

A ( front - rear + 1) % mB ( rear - front + 1) % mC ( front - rear + m) % mD ( rear - front + m) % m11、一个数组元素a[i]与( A )的表示等价。

纸上谈兵:AVL树

纸上谈兵:AVL树

纸上谈兵:AVL树⼆叉搜索树的深度与搜索效率我们在中提到,⼀个有n个节点的⼆叉树,它的最⼩深度为log(n),最⼤深度为n。

⽐如下⾯两个⼆叉树:深度为n的⼆叉树深度为log(n)的⼆叉树这两个⼆叉树同时也是⼆叉搜索树(参考)。

注意,log以2为基底。

log(n)是指深度的量级。

根据我们对深度的定义,精确的最⼩深度为floor(log(n)+1)。

我们将处于同⼀深度的节点归为⼀层。

如果除最后⼀层外的其他层都被节点填满时,⼆叉树有最⼩深度log(n)。

⼆叉搜索树的深度越⼩,那么搜索所需要的运算时间越⼩。

⼀个深度为log(n)的⼆叉搜索树,搜索算法的时间复杂度也是log(n)。

然⽽,我们在中已经实现的插⼊和删除操作并不能让保持log(n)的深度。

如果我们按照8,7,6,5,4,3,2,1的顺序插⼊节点,那么就是⼀个深度为n的⼆叉树。

那么,搜索算法的时间复杂度为n。

n和log(n)的时间复杂度意味着什么呢?时间复杂度代表了完成算法所需要的运算次数。

时间复杂度越⼩,算法的速度越快。

可以看到,随着元素的增加,log(n)的时间复杂度的增长要远⼩于n。

所以,我们⾃然希望⼆叉搜索树能尽可能保持log(n)的深度。

在上⾯深度为n的例⼦中,我们发现,每个节点只有左节点被填满。

树的每⼀层都有很多空位。

能不能尽可能减少每⼀层的空位呢? (相应的,减少树的深度)“紧致”的树⼀种想法是先填满⼀层,再去填充下⼀层,这样就是⼀个完全⼆叉树(complete binary tree)。

这样的⼆叉树实现插⼊算法会⽐较复杂。

我们将介绍⼀种思路相似,但⽐较容易实现的树状数据结构——AVL树。

AVL树AVL树是根据它的发明者G. M. A delson-V elskii和E. M. L andis命名的。

它是⼀种特殊的⼆叉搜索树。

AVL树要求: 任⼀节点的左⼦树深度和右⼦树深度相差不超过1(空树的深度为0。

注意,有的教材中,采⽤了不同的深度定义⽅法,所以空树的深度为-1)下⾯是AVL树:AVL树的特性让⼆叉搜索树的节点实现平衡(balance):节点相对均匀分布,⽽不是偏向某⼀侧。

数据结构与算法模拟习题(附参考答案)

数据结构与算法模拟习题(附参考答案)

数据结构与算法模拟习题(附参考答案)一、单选题(共86题,每题1分,共86分)1.具有5个顶点的有向完全图有多少条弧?A、16B、20C、25D、10正确答案:B2.下列程序的时间复杂度为()。

i = 0; s = 0;while(s < n){i++;s = s + i;}A、Θ(n)B、Θ(1)C、Θ(n2)D、Θ(n½)正确答案:D3.栈和队列的共同点是()。

A、没有共同点B、只允许在端点处插入和删除元素C、都是先进后出D、都是先进先出正确答案:B4.下面描述中正确的为( )。

A、线性表的逻辑顺序与物理顺序总是一致的B、线性表的顺序存储表示优于链式存储表示。

C、线性表若采用链式存储表示时所有结点之间的存储单元地址可连续可不连续。

D、二维数组是其数组元素为线性表的线性表。

正确答案:C5.对N个不同的数据采用冒泡算法进行从大到小的排序,下面哪种情况下肯定交换元素次数最多?A、从大到小排好的B、元素无序C、元素基本有序D、从小到大排好的正确答案:D6.表达式3*2^(4+2*2-6*3)-5求值过程中当扫描到6时,对象栈和算符栈为(),其中^为乘幂。

A、3, 2, 8;( * ^ -B、3, 2, 4, 2, 2;( * ^ ( -C、3, 2, 4, 1, 1;( ^ ( + -D、3, 2, 8;( * ^ ( -正确答案:D7.二叉树的高度若根节点为高度1,一棵具有 1025 个结点的二叉树的高度为▁▁▁▁▁ 。

A、10~1024 之间B、11~1025 之间C、10D、11正确答案:B8.数据采用链式存储结构时,要求( )A、每个节点占用一片连续的存储区域B、所有节点占用一片连续的存储区域C、节点的最后一个数据域一定是指针类型D、每个节点有多少个后继就设多少个指针域正确答案:A9.在N个结点的顺序表中,算法的时间复杂度为O(1)的操作是:A、将N个结点从小到大排序B、删除第i个结点(1≤i≤N)C、访问第i个结点(1≤i≤N)和求第i个结点的直接前驱(2≤i≤N)D、在第i个结点后插入一个新结点(1≤i≤N)正确答案:C10.将元素序列{18, 23, 4, 26, 31, 33, 17, 39}按顺序插入一个初始为空的、大小为13的散列表中。

AVL树——精选推荐

AVL树——精选推荐

AVL树1,AVL树⼜称平衡⼆叉树,它⾸先是⼀颗⼆叉查找树,但在⼆叉查找树中,某个结点的左右⼦树⾼度之差的绝对值可能会超过1,称之为不平衡。

⽽在平衡⼆叉树中,任何结点的左右⼦树⾼度之差的绝对值会⼩于等于 1。

2,为什么需要AVL树呢?在⼆叉查找树中最坏情况下查找某个元素的时间复杂度为O(n),⽽AVL树能保证查找操作的时间复杂度总为O(logn)。

3.avl树通过单旋转或者双旋转来实现保证树的平衡avl树和伸展树有很多相似之处,可以查看:伸展树的特点;AVL树AVL树是根据它的发明者G. M. Adelson-Velskii和E. M. Landis命名的。

它是⼀种特殊的。

AVL树要求: 任⼀节点的左⼦树深度和右⼦树深度相差不超过1(空树的深度为0。

注意,有的教材中,采⽤了不同的深度定义⽅法,所以空树的深度为-1)下⾯是AVL树:AVL树AVL树的特性让⼆叉搜索树的节点实现平衡(balance):节点相对均匀分布,⽽不是偏向某⼀侧。

因此,AVL树的搜索算法复杂度是log(n)的量级。

我们在中定义的操作,除了插⼊,都可以⽤在AVL树上 (假设使⽤懒惰删除)。

如果进⾏插⼊操作,有可能会破坏AVL树的性质,⽐如:插⼊2: 破坏AVL树观察节点5,它的左⼦树深度为2,右⼦树深度为0,所以左右两个⼦树深度相差为2,不再是AVL树。

由于2的加⼊,从节点6,1,5,3到2的层数都增加1。

6, 1, 5节点的AVL性质都被破坏。

如果从节点2向上回溯,节点5是第⼀个被破坏的。

从节点3开始的⼦树深度加1,这是造成6, 1, 5的AVL性质被破坏的本质原因。

我们将5和3之间的路径画成虚线(就好像挂了重物,边被拉断⼀样)。

我们可以通过单旋转(single rotation),调整以5为根节点的⼦树,来修正因为插⼊⼀个元素⽽引起的对AVL性质的破坏。

如下:Single rotation: 左侧超重,向右转通过单旋转,3成为新的根节点,2,5称为3的左右⼦节点。

ds200908_avl&hash

ds200908_avl&hash

2014-3-19
北京化工大学信息学院 数据结构
24
右单旋转
左单旋转
左右双旋转
右左双旋转
左单旋转 (RotateLeft ) +1
A
0
+2
A
+1 C
C A E B
0
0
B
C
B E
h D h
E D h + h 1
h D h
h
h + 1
h
25
2014-3-19
北京化工大学信息学院 数据结构
右单旋转
左单旋转
2014-3-19
北京化工大学信息学院 数据结构
12
if ( ptr == NULL ) { //空二叉树 ptr = new BstNode; //创建结点 if ( ptr == NULL ) { cout << “存储不足" << endl; exit (1); } ptr->data = x; ptr->leftChild = ptr->rightChild = NULL; } else if ( x < ptr->data ) //在左子树插入 Insert ( x, ptr->leftChild ); else if ( x > ptr->data ) //在右子树插入 Insert ( x, ptr->rightChild ); }
25
20
40
30
2014-3-19
北京化工大学信息学院 数据结构
7


假设想要在二叉搜索树中搜索关键码为x的元素, 搜索过程从根结点开始。 如果根指针为 NULL,则搜索不成功;否则用给 定值 x 与根结点的关键码进行比较: 如果给定值等于根结点的关键码,则搜索成 功。 如果给定值小于根结点的关键码,则继续递 归搜索根结点的左子树; 否则。递归搜索根结点的右子树。

数据结构查找习题及答案

数据结构查找习题及答案

第9章查找一、单选题1.对一棵二叉搜索树按〔〕遍历,可得到结点值从小到大的排列序列。

A. 先序B. 中序C. 后序D. 层次2.从具有n个结点的二叉搜索树中查找一个元素时,在平均情况下的时间复杂度大致为〔〕。

A. O(n)B. O(1)C. O(logn)D. O(n2)3.从具有n个结点的二叉搜索树中查找一个元素时,在最坏情况下的时间复杂度为〔〕。

A. O(n)B. O(1)C. O(logn)D. O(n2)4.在二叉搜索树中插入一个结点的时间复杂度为〔〕。

A. O(1)B. O(n)C. O(logn)D. O(n2)5.分别以下列序列构造二叉搜索树,与用其它三个序列所构造的结果不同的是〔〕。

A.〔100,80,90,60,120,110,130〕B.〔100,120,110,130,80,60,90〕C.〔100,60,80,90,120,110,130〕D.〔100,80,60,90,120,130,110〕6.在一棵AVL树中,每个结点的平衡因子的取值X围是〔〕。

A. -1~1B. -2~2C. 1~2D. 0~17.根据一组关键字〔56,42,50,64,48〕依次插入结点生成一棵A VL树,当插入到值为〔〕的结点时需要进行旋转调整。

A. 42B. 50C. 64D. 488.深度为4的A VL树至少有〔〕个结点。

A.9 B.8C.7D.69.一棵深度为k的A VL树,其每个分支结点的平衡因子均为0,则该平衡二叉树共有〔〕个结点。

A.2k-1-1B.2k-1+1C.2k-1D.2k10.在A VL树中插入一个结点后造成了不平衡,设最低的不平衡结点为A,并已知A的左孩子的平衡因子为0,右孩子的平衡因子为1,则应作〔〕型调整以使其平衡。

A. LLB. LRC. RLD. RR二、判断题1.二叉搜索树的任意一棵子树中,关键字最小的结点必无左孩子,关键字最大的结点必无右孩子。

2.二叉搜索树中每个结点的关键字值大于其左非空子树〔若存在的话〕所有结点的关键字值,且小于其右非空子树〔若存在的话〕所有结点的关键字值。

数据结构题——精选推荐

数据结构题——精选推荐

数据结构题第六章树和⼆叉树简答题1、有⼀棵树的括号表⽰为A(B,C(E,F(G)),D),回答下⾯的问题:这棵树的根结点是谁?这棵树的叶⼦结点是什么?结点C的度是多少?这棵树的度是多少?这棵树的深度是多少?结点C的孩⼦结点是哪些?结点C的双亲结点是谁?2、若⼀棵度为4的树中度为1,2,3,4的结点个数分别是4,3,2,2,则该树中叶⼦结点的个数是多少?总结点个数是多少?3、⼀棵⾼度为h的完全k次数,如果按照层次⾃上向下、⾃左向右的顺序从1开始对全部结点编号,试问:最多有多少个结点?最少有多少个结点?编号为q的结点的第i个孩⼦结点的编号是多少?4、若⼀棵⼆叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数为结点的总个数为5、⼀棵完全⼆叉树有1001个结点,其中叶⼦结点的个数为6、⼀棵⾼度为h的完全⼆叉树⾄少有个结点。

7、⼀棵⾼度为5的完全⼆叉树⾄多有个结点。

8、设⾼度为h的⼆叉树上只有度为0和度为2的结点,则此类⼆叉树⾄少包含个结点。

9、⼀个具有1025个结点的⼆叉树的⾼度h为10、在⼀棵完全⼆叉树中,结点个数为n,则编号最⼤的分⽀结点的编号为11、⼀棵⼆叉树的先序遍历为ABCDEF,中序遍历为CBAEDF,则后序遍历为12、⼀棵⼆叉树的先序遍历为ABCDEFG,它的中序遍历可能为A.CABDEFGB. ABCDEFGC.DACEFBGD.ADCFEGB思考:⼆叉树的先序和中序遍历相同的条件是?⼆叉树的后序和中序遍历相同的条件是?13、⼀棵⼆叉树的后序遍历为DABEC,中序遍历为DEBAC,则先序遍历为14、⼀棵⼆叉树的先序遍历为EFHIGJK,中序遍历为HFIEJKG,则该⼆叉树根结点的右孩⼦为16、根据使⽤频率为5个字符设计的赫夫曼编码不可能的是A.111,110,10,01,00B.000,001,010,011,1C.100,11,10,1,0D.001,000,01,11,1017、根据使⽤频率为5个字符设计的赫夫曼编码不可能的是A. 000,001,010,011,1B.0000,0001,001,01,1C. 000,001,01,10,11D.00,100,101,110,11118、设有13个值,⽤它们组成⼀棵赫夫曼树,则该赫夫曼树共有个结点。

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