数据结构练习 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. (转)基于jQuery的form转json示例

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. Java:类与继承

    Java:类与继承 对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础.抽象.封装.继承.多态这四大特性都离不开类,只有存在类,才能体现面向对象编程的特点,今天我们就来了解一些类与继承的相关知 ...

  3. java设计模式之策略模式

    策略模式 定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户(大话设计模式). 策略模式UML图   策略模式代码 古代的各种计谋都是一种策略,这次我们 ...

  4. C#中使用FreeImage库加载Bmp、JPG、PNG、PCX、TGA、PSD等25种格式的图像(源码)。

    其实我一直都是喜欢自己去做图像格式的解码的(目前我自己解码的图像格式大概有15种),但是写本文主要原因是基于CSDN的这个帖子的: http://bbs.csdn.net/topics/3905104 ...

  5. Oracle数据库语言——结构化查询语言SQL

    一.数据定义语言DDL 1.创建表空间:CREAT TABLESPACE lyy DATAFILE 'C:/app/lyy.dbf' SIZE 10M;(创建一个10M的表空间,存放在C盘app文件夹 ...

  6. Android UI组件----AppWidget控件入门详解

    Widget引入 我们可以把Widget理解成放置在桌面上的小组件(挂件),有了Widget,我们可以很方便地直接在桌面上进行各种操作,例如播放音乐. 当我们长按桌面时,可以看到Widget选项,如下 ...

  7. python高级之网络编程

    python高级之网络编程 本节内容 网络通信概念 socket编程 socket模块一些方法 聊天socket实现 远程执行命令及上传文件 socketserver及其源码分析 1.网络通信概念 说 ...

  8. Linux网卡配置及学习linux的注意事项

    一.网卡配置 1.ifconfig网卡信息,配置IP ifconfig eth0 192.168.2.102 2.修改网卡配置(连接不了可能是IP给占用了) 进入编辑界面命令:vi /etc/sysc ...

  9. flex引起height:100%失效

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  10. mac os 下搭建android开发环境

    mac os 下搭建android开发环境 周银辉 mac os 下搭建android环境比较方便, 如下几个步骤: 1,安装jdk 先搞清楚自己是否已经安装,在命令行下:java -version, ...