数据结构练习 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. javascript运算符语法概述

    × 目录 [1]个数 [2]优先级 [3]结合性[4]类型[5]规则表 前面的话 javascript中的运算符大多由标点符号表示,少数由关键字表示,它们的语法言简意赅,它们的数量却着实不少.运算符始 ...

  2. C语言中结构体赋值问题的讨论

    今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...

  3. 对象比较器:Comparable和Comparator

    在进行对象数组排序的过程中需要使用到比较器,比较器有两个:Comparable和Comparator ①.java.lang.Comparable:是在类定义是时候默认实现好的接口,里面提供有一个co ...

  4. Freemarker与普通java

    package com.sxt.test.freemarker; import java.io.File; import java.io.OutputStreamWriter; import java ...

  5. jquery的css详解(一)

    通过阅读源码可以发现css是jq的实例方法.而在内部调用jq的工具方法access来实现的,对该方法不了解的朋友请点击 -> jquery工具方法access详解 在access的回调中做了一个 ...

  6. ReactNative新手学习之路07ListView_ renderHeader使用StaticContainer

    react native新手学习之路07ListView_ renderHeader使用StaticContainer 1.某些特殊场景需要用ScrollView滚动和ListView配合但是不幸运的 ...

  7. javascript正则表达式:匹配所有html标签

    此正则表达式收集于网络,但那个网站连复制一下都需要注册会员,鄙视之,所以不提他了.而且,原作者也不可能是那个网站. html标签有<h1></h1>这种成对的,也有<br ...

  8. 关于javascript中apply()和call()方法的区别

    如果没接触过动态语言,以编译型语言的思维方式去理解javaScript将会有种神奇而怪异的感觉,因为意识上往往不可能的事偏偏就发生了,甚至觉得不可理喻.如果在学JavaScript这自由而变幻无穷的语 ...

  9. 关于C#中readonly的一点小研究

    可能园子里有不少文章已经说明了这个问题了,但是我在这里写这篇博客只是写写自己的一些体会,也权当是整理归纳,高手莫见笑. ===============正文分割线================== 现 ...

  10. (转)C#为什么要使用Invoke,它和BeginInvoke有什么区别

    在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate. 一.为什么Control类提供了Invoke和BeginInvoke机制? 关于这个问题的最主要的原因已经是do ...