数据结构练习 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. [WPF系列]-基础系列 TabControl应用

    引言 Tabcontrol控件也是我们在项目中经常用到的一个控件,用它将相关的信息组织在一起分类显示. 简介     ========================================= ...

  2. JS -- 异步加载进度条

    今天在博客园问答里面看到博友问道怎么实现Ajax异步加载产生进度条. 很好奇就自己写了一个. 展现效果: 1) 当点击Load的时候,模拟执行异步加载. 浏览器被遮挡. 进度条出现. 实现思路: 1. ...

  3. 【2016-11-3】【坚持学习】【Day18】【Oracle 数据类型 与C#映射关系】

    大部分类型的对应关系:原文:http://2143892.blog.51cto.com/2133892/499353 序号 Oracle数据类型 .NET类型 GetOracleValue类型 DbT ...

  4. 【2016-10-20】【坚持学习】【Day10】【反射2】

    Type类的属性:        Name 数据类型名        FullName 数据类型的完全限定名(包括命名空间名)        Namespace 定义数据类型的命名空间名        ...

  5. idea快捷键(自用)

    idea快捷键(自用) 1.比如输入eclipse下面的main,sysout等,在idea里面同样可以实现,如下: sysout(sout 按tab),main(psvm按tab),具体可按照ctr ...

  6. 不封装ajax 带url参数调用接口

    html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  7. Linux服务器高并发实践经历

    作为一个师父离职早的野生程序员,业务方面还可以达到忽悠别人的水平,但上升到性能层面那就是硬伤. 真实天上掉馅饼,公司分配了一个测试性能的任务,真是感觉我的天空星星都亮了. 高并发主要限制因素:CPU. ...

  8. EasyUI datagrildview导出excel报表

    $.extend($.fn.datagrid.methods, { toExcel: function(jq, filename){ return jq.each(function(){ var ur ...

  9. C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建

    前言:好久没更新博客了,每天被该死的业务缠身,今天正好一个模块完成了,继续来完善我们的代码.之前的六篇完成了领域层.应用层.以及基础结构层的部分代码,这篇打算搭建下UI层的代码. DDD领域驱动设计初 ...

  10. java IO流复制图片

    一.使用字节流复制图片 //字节流方法 public static void copyFile()throws IOException { //1.获取目标路径 //(1)可以通过字符串 // Str ...