PAT MOOC dataStructure 4-1
数据结构练习 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的更多相关文章
- PAT Mooc datastructure 6-1
Saving James Bond - Hard Version This time let us consider the situation in the movie "Live and ...
- PAT mooc DataStructure 4-2 SetCollection
数据结构习题集-4-2 集合的运用 1.题目: We have a network of computers and a list of bi-directional connections. Eac ...
- PAT B1080 MOOC期终成绩(C++)
PAT甲级目录 | PAT乙级目录 题目描述 B1080 MOOC期终成绩 解题思路 可利用 map 将字符串型的学号转换为整型的序号,方便查找.输入全部成绩后,遍历每个学生同时计算最终成绩,然后将成 ...
- PAT 乙级 1080 MOOC期终成绩 (25 分)
1080 MOOC期终成绩 (25 分) 对于在中国大学MOOC(http://www.icourse163.org/ )学习“数据结构”课程的学生,想要获得一张合格证书,必须首先获得不少于200分的 ...
- PAT 1080 MOOC期终成绩(25)(STL-map及multiset+思路+测试点分析)
1080 MOOC期终成绩(25 分) 对于在中国大学MOOC(http://www.icourse163.org/ )学习"数据结构"课程的学生,想要获得一张合格证书,必须首先获 ...
- PAT 1080 MOOC期终成绩
https://pintia.cn/problem-sets/994805260223102976/problems/994805261493977088 对于在中国大学MOOC(http://www ...
- PAT Basic 1080 MOOC期终成绩 (25 分)
对于在中国大学MOOC(http://www.icourse163.org/ )学习“数据结构”课程的学生,想要获得一张合格证书,必须首先获得不少于200分的在线编程作业分,然后总评获得不少于60分( ...
- 【PAT】B1080 MOOC期终成绩(25 分)
还是c++好用,三部分输入直接用相同的方法, 用map映射保存学生在结构体数组中的下标. 结构体保存学生信息,其中期末成绩直接初始化为-1, 注意四舍五入 此题还算简单 #include<ios ...
- PAT乙级考前总结(三)
特殊题型 1027 打印沙漏 (20 分) 题略,感觉有点像大学里考试的题.找规律即可. #include <stdio.h>#include <iostream>using ...
随机推荐
- hyper容器网络相关源码分析
一.网络初始化 1.hyperd/daemon/daemon.go func NewDaemon(cfg *apitypes.HyperConfig) (*Daemon, error) .... 调用 ...
- cin
cin 是预定义的标准输入流对象,cin 用来接收字符串时,遇“空格”.“TAP”.“回车”时都会结束.
- Java实现数组排序
package com.souvc.hibernate.exp; public class MySort { /** * 方法名:main</br> * 详述:Java实现数组排序 < ...
- 3942: [Usaco2015 Feb]Censoring [KMP]
3942: [Usaco2015 Feb]Censoring Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 375 Solved: 206[Subm ...
- IIS部署站点相关经验总结
IIS部署站点相关经验总结 1.IIS和.net4.0安装是有先后顺序的,应该先安装.net framework 4.0,再安装IIS.如果按相反顺序安装的话,IIS中看不到4.0相关的东西,那么只能 ...
- 如何使iframe透明
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- iframe异步加载技术及性能
我们会经常使用iframes来加载第三方的内容.广告或者插件.使用iframe是因为它可以和主页面并行加载,不会阻塞主页面.当然使用iframe也是有利有弊的:Steve Souders在他的blog ...
- 配置容器configuring Containsers
容器可以在运行时配置,相反的也可以通过应用程序的配置文件(或扩展配置文件)来配置. Unity的三个高级功能:泛型装饰链.解析器重写和数组注入. 1.配置开放式泛型来解析封闭式泛型 只要不是为封闭型泛 ...
- 一个五年 Android 开发者百度、阿里、聚美、映客的面试心经
花絮 也许会有人感叹某些人的运气比较好,但是他们不曾知道对方吃过多少苦,受过多少委屈.某些时候就是需要我们用心去发现突破点,然后顺势而上,抓住机遇,那么你将会走向另外一条大道,成就另外一个全新的自我. ...
- 梦想成真,喜获微软MVP奖项,微软MVP FAQ?
之前一直很钦佩那些MVP获奖者,想着自己有一天也能拿到该多好,就在10月1日邮箱收到了微软的邮件,当选了2016年10月份的MVP.今天主要分享一下获奖的喜悦也分享一下如何获得MVP奖项. 什么是微软 ...