数据结构练习 4-1 AVL 树

1. 题目:

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer N (<=20) which is the total number of keys to be inserted. Then N distinct integer keys are given in the next line. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print ythe root of the resulting AVL tree in one line.

Sample Input 1:

5
88 70 61 96 120

Sample Output 1:

   70

2.题目分析:

非常典型的AVL平衡二叉树的实现。

根据老师提供的代码框架结构进行编程。 里面运用了递归的算法,这一点是我比较薄弱的地方。每次遇到递归头就会变大。随着递归的螺旋脑子就会越来越不清晰。呜呜

题目的要求就是依次插入数结点,并按照左小右大的规则插入数值。

使用InsertNode函数递归进行插入。如果数值大于当前结点数值,则递归插入到右侧子树。反之亦然。

同时,每次插入结束后,要递归的的更改树节点高度的值,以使得上层的节点可以对比左右两子树的高度差以判别本身是否平衡。

如果判断当前节点不平衡,因为是递归运行的程序,所以其子节点一定平衡,当前节点为第一个不平衡的节点,此时通过LL,LR,RR或者RL对当前节点进行平衡调整。

调整的方法以LL为例。

此时,当前节点A不平衡,且插入的节点位于左子树B的左子树C。

首先, 将A->left(原为B)指向B->right, 完成交换。然后将B->right = A,然后返回B,此时B的右子树为A,同时B原本的右子树变为A的左子树。

然后返回B,此时上层的指针便会指向B,同时B层平衡。如果发现此时上层又不平衡,则继续调整,直到返回Root,更新根节点。

LR则是 先对 A 的左子树B进行 RR,再将A进行LL。以保持树的平衡。

3.源代码:

#include <stdio.h>
#include <stdlib.h> typedef struct AVLnode{
int height;
struct AVLnode * left;
struct AVLnode * right;
int data;
}tAVLnode, *pAVL; pAVL SingleLeftRotation(pAVL T); pAVL DoubleLeftRightRotation(pAVL T); pAVL SingleRightRotation(pAVL T); pAVL DoubleRightLeftRotation(pAVL T); pAVL InsertNode(int data, pAVL T); int GetHeight(pAVL T); pAVL InsertNode(int data, pAVL T)
{
if(!T)
{
T = (pAVL)malloc(sizeof(tAVLnode));
T->data = data;
T->height = ;
T->left = NULL;
T->right = NULL;
}
else if(data < T->data)
{
T->left = InsertNode(data,T->left);
if(GetHeight(T->left)-GetHeight(T->right)== )
{
if(data < T->left->data)
{
T=SingleLeftRotation(T);
}
else
{
T=DoubleLeftRightRotation(T);
}
}
}
else if(data > T->data)
{
T->right = InsertNode(data,T->right);
if(GetHeight(T->left)-GetHeight(T->right) == -)
{
if(data > T->right->data)
{
T=SingleRightRotation(T);
}
else
{
T=DoubleRightLeftRotation(T);
}
}
}
T->height = (GetHeight(T->left)>=GetHeight(T->right))?GetHeight(T->left)+:GetHeight(T->right)+; return T;
} pAVL SingleLeftRotation(pAVL T)
{
pAVL B = T->left;
T->left = B->right;
B->right = T;
T->height = (GetHeight(T->left)>=GetHeight(T->right))?GetHeight(T->left)+:GetHeight(T->right)+;
B->height = (GetHeight(B->left)>=GetHeight(B->right))?GetHeight(B->left)+:GetHeight(B->right)+;
return B;
} pAVL DoubleLeftRightRotation(pAVL T)
{
T->left = SingleRightRotation(T->left);
return SingleLeftRotation(T);
} pAVL SingleRightRotation(pAVL T)
{
pAVL B = T->right;
T->right = B->left;
B->left = T;
T->height = (GetHeight(T->left)>=GetHeight(T->right))?GetHeight(T->left)+:GetHeight(T->right)+;
B->height = (GetHeight(B->left)>=GetHeight(B->right))?GetHeight(B->left)+:GetHeight(B->right)+;
return B;
} pAVL DoubleRightLeftRotation(pAVL T)
{
T->right = SingleLeftRotation(T->right);
return SingleRightRotation(T);
} int GetHeight(pAVL T)
{
if(!T)
{
return -;
}
else
{
return T->height;
}
} int main()
{
int nodeSum;
int data;
int i;
pAVL Root = NULL; scanf("%d", &nodeSum); for(i=;i<nodeSum;i++)
{
scanf("%d",&data);
Root = InsertNode(data,Root);
}
printf("%d",Root->data);
}

PAT MOOC dataStructure 4-1的更多相关文章

  1. PAT Mooc datastructure 6-1

    Saving James Bond - Hard Version This time let us consider the situation in the movie "Live and ...

  2. PAT mooc DataStructure 4-2 SetCollection

    数据结构习题集-4-2 集合的运用 1.题目: We have a network of computers and a list of bi-directional connections. Eac ...

  3. PAT B1080 MOOC期终成绩(C++)

    PAT甲级目录 | PAT乙级目录 题目描述 B1080 MOOC期终成绩 解题思路 可利用 map 将字符串型的学号转换为整型的序号,方便查找.输入全部成绩后,遍历每个学生同时计算最终成绩,然后将成 ...

  4. PAT 乙级 1080 MOOC期终成绩 (25 分)

    1080 MOOC期终成绩 (25 分) 对于在中国大学MOOC(http://www.icourse163.org/ )学习“数据结构”课程的学生,想要获得一张合格证书,必须首先获得不少于200分的 ...

  5. PAT 1080 MOOC期终成绩(25)(STL-map及multiset+思路+测试点分析)

    1080 MOOC期终成绩(25 分) 对于在中国大学MOOC(http://www.icourse163.org/ )学习"数据结构"课程的学生,想要获得一张合格证书,必须首先获 ...

  6. PAT 1080 MOOC期终成绩

    https://pintia.cn/problem-sets/994805260223102976/problems/994805261493977088 对于在中国大学MOOC(http://www ...

  7. PAT Basic 1080 MOOC期终成绩 (25 分)

    对于在中国大学MOOC(http://www.icourse163.org/ )学习“数据结构”课程的学生,想要获得一张合格证书,必须首先获得不少于200分的在线编程作业分,然后总评获得不少于60分( ...

  8. 【PAT】B1080 MOOC期终成绩(25 分)

    还是c++好用,三部分输入直接用相同的方法, 用map映射保存学生在结构体数组中的下标. 结构体保存学生信息,其中期末成绩直接初始化为-1, 注意四舍五入 此题还算简单 #include<ios ...

  9. PAT乙级考前总结(三)

    特殊题型 1027 打印沙漏 (20 分) 题略,感觉有点像大学里考试的题.找规律即可. #include <stdio.h>#include <iostream>using ...

随机推荐

  1. oracle 倒库后insert id冲突的问题

    错误为:ORA-00001: unique constraint violated 把test库的数据导入到另一个库后,忘记修改自增id sequence的nextval了,因此,当前的数据库中数据和 ...

  2. 摆脱jquery,用自己的JS库实现ajax功能

    可以将下面的代码保存在一个文件里如:myAjax.js,以后在项目中如果觉得jquery那一套很重,就完全可以使用自己的ajax库,不用担心性能和兼容性! /** * 创建ajax请求对象 * @re ...

  3. HDU1329 Hanoi Tower Troubles Again!——S.B.S.

    Hanoi Tower Troubles Again! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  4. angular中自定义依赖注入的方法和decorator修饰

    自定义依赖注入的方法 1.factory('name',function () { return function(){ } }); 2.provider('name',function(){ thi ...

  5. PAT 1037. 在霍格沃茨找零钱(20)

    如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 -- 就如海格告诉哈利的:"十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易.& ...

  6. BZOJ 3505 【Cqoi2014】 数三角形

    Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个. 下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. Input 输入一行,包含两个空格分隔的正整数m ...

  7. Python-02-基础

    一.数字 int(有符号整型) Python3可以处理任意大小的整数,当然包括负整数. int = 20 print int long(长整型) Python3中不再区分整型和长整型. float(浮 ...

  8. 新书《编写可测试的JavaScript代码 》出版,感谢支持

    本书介绍 JavaScript专业开发人员必须具备的一个技能是能够编写可测试的代码.不管是创建新应用程序,还是重写遗留代码,本书都将向你展示如何为客户端和服务器编写和维护可测试的JavaScript代 ...

  9. ZooKeeper 笔记(5) ACL(Access Control List)访问控制列表

    zk做为分布式架构中的重要中间件,通常会在上面以节点的方式存储一些关键信息,默认情况下,所有应用都可以读写任何节点,在复杂的应用中,这不太安全,ZK通过ACL机制来解决访问权限问题,详见官网文档:ht ...

  10. AVA数据库连接池.

    package db_pool; //// 一个效果非常不错的JAVA数据库连接池.// from:http://www.jxer.com/home/?uid-195-action-viewspace ...