04-树5 Root of AVL Tree(浙大数据结构PTA习题)

04-树5 Root of AVL Tree        分数 25        作者 陈越        单位 浙江大学

An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this property. Figures 1-4 illustrate the rotation rules.

F1.jpg

F2.jpg

F3.jpg

F4.jpg

Now given a sequence of insertions, you are supposed to tell the root of the resulting AVL tree.

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 the root of the resulting AVL tree in one line.

Sample Input 1:

5
88 70 61 96 120

Sample Output 1:

70

Sample Input 2:

7
88 70 61 96 120 90 65

Sample Output 2:

88

代码长度限制:16 KB        时间限制:400 ms        内存限制:64 MB

题目解析:

主要考察平衡二叉树的插入问题。若插入元素后不平衡,一共将有四种情况调整为平衡,即左单旋、右单旋、左-右双旋、右-左双旋,如下图所示。

参考代码: 

# include<stdio.h>
# include<stdlib.h>

typedef int ElementType;

typedef struct TreeNode* BinTree;
struct TreeNode{
	ElementType data;
	BinTree Left;
	BinTree Right;
};

BinTree SingleLeftRotation(BinTree Tree);
BinTree SingleRightRotation(BinTree Tree);
BinTree DoubleLRRotation(BinTree Tree);
BinTree DoubleRLRotation(BinTree Tree);
ElementType GetHeight(BinTree Tree);
ElementType Max(ElementType a, ElementType b);
BinTree InsertBinTree(BinTree Tree,ElementType X);

int main(){
	// 接收结点个数
	int N;
	scanf("%d",&N);
	// 创建一棵空平衡二叉树
	BinTree Tree = NULL;
	// 向平衡二叉树中插入结点
	int i,X;
	for(i=0;i<N;i++){
		scanf("%d",&X);
		Tree = InsertBinTree(Tree,X);
	}
	// 输出根结点数据
	printf("%d",Tree->data);
	return 0; 
}


// 向平衡二叉树中插入元素,并返回插入后的根结点 
BinTree InsertBinTree(BinTree Tree,ElementType X){
	// 如果是空树,则建树并返回
	if(Tree==NULL){
		Tree = (BinTree)malloc(sizeof(struct TreeNode));
		Tree->data = X;
		Tree->Left = Tree->Right = NULL;
		return Tree; 
	}
	// 递归插入 
	if(X<Tree->data){
		// 递归插入左子树
		Tree->Left = InsertBinTree(Tree->Left,X);
		// 判读是否平衡 
		if(GetHeight(Tree->Left)-GetHeight(Tree->Right)>1){
			if(X>Tree->Left->data){
				// 左-右双旋
				Tree = DoubleLRRotation(Tree); 
			}else{
				// 左单旋
				Tree = SingleLeftRotation(Tree); 
			}
		} 
	}else{
		// 递归插入右子树
		Tree->Right = InsertBinTree(Tree->Right,X);
		// 判读是否平衡 
		if(GetHeight(Tree->Right)-GetHeight(Tree->Left)>1){
			if(X<Tree->Right->data){
				// 右-左双旋
				Tree = DoubleRLRotation(Tree); 
			}else{
				// 右单旋
				Tree = SingleRightRotation(Tree); 
			}
		} 
	}
	return Tree;
}


// 左单旋,并返回旋转后的根结点 
BinTree SingleLeftRotation(BinTree Tree){
	// 进行旋转 
	BinTree Root = Tree->Left;
	Tree->Left = Root->Right;
	Root->Right = Tree;
	return Root;
}

// 右单旋,并返回旋转后的根结点
BinTree SingleRightRotation(BinTree Tree){
	// 进行旋转 
	BinTree Root = Tree->Right;
	Tree->Right = Root->Left;
	Root->Left = Tree;
	return Root; 
}

// 左-右双旋,并返回旋转后的根结点
BinTree DoubleLRRotation(BinTree Tree){
	// 先右旋再左旋 
	Tree->Left = SingleRightRotation(Tree->Left);
	BinTree Root = SingleLeftRotation(Tree);
	return Root;
} 

// 右-左双旋,并返回旋转后的根结点
BinTree DoubleRLRotation(BinTree Tree){
	// 先左旋再右旋
	Tree->Right = SingleLeftRotation(Tree->Right);
	BinTree Root = SingleRightRotation(Tree);
	return Root; 
	 
} 

// 递归获取树高
ElementType GetHeight(BinTree Tree){
	if(Tree==NULL)return 0;
	else return Max(GetHeight(Tree->Left),GetHeight(Tree->Right))+1;
} 

// 返回两者中的较大者 
ElementType Max(ElementType a, ElementType b){
	return a>b?a:b;
} 
 

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/663858.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VMware虚拟机安装Ubuntu-Server版教程(超详细)

目录 1. 下载2. 安装 VMware3. 安装 Ubuntu3.1 新建虚拟机3.2 安装操作系统 4. SSH方式连接操作系统4.1 好用的SSH工具下载&#xff1a;4.2 测试SSH连接 5. 开启root用户登录5.1 设置root用户密码5.2 传统方式切换root用户5.3 直接用root用户登录5.4 SSH启用root用户登录 6. 安…

Kali 我来了

Kali 我来了 1、官网下载2、修改密码3、开启SSH远程登录服务4、关闭kali图形化界面 1、官网下载 官方链接: https://www.kali.org/ 下载链接: https://cdimage.kali.org/kali-2024.1/kali-linux-2024.1-vmware-amd64.7z 解压后 直接导入 VmWare 就可使用可爱的小 Kali 了。 …

太阳能智能农业气象站:创新科技引领现代农业革命

TH-NQ14在科技日新月异的今天&#xff0c;现代农业正迎来一场由智能化、精准化、绿色化驱动的深刻变革。太阳能智能农业气象站作为这场变革的先锋力量&#xff0c;以其独特的优势和强大的功能&#xff0c;为现代农业的发展注入了新的活力&#xff0c;并引领着农业生产的未来趋势…

el-date-picker的使用,及解决切换type时面板样式错乱问题

这里选择器的类型可以选择日月年和时间范围&#xff0c;根据类型不同&#xff0c;el-date-picker的面板也展示不同&#xff0c;但是会出现el-date-picker错位&#xff0c;或者面板位置和层级等问题。 源代码&#xff1a; <el-selectv-model"dateType"placeholder&…

【漏洞复现】Check Point 安全网关任意文件读取漏洞(CVE-2024-24919)

0x01 产品简介 Check Point Security Gateways 是 Check Point Sofware 提供的一系列 网络安全Q解决方案。这些解决方案包括下一代防火墙(NGFW)、数据中心安全网关和 A1驱动的量子网关&#xff0c;旨在为企业提供针对复杂网络威胁的先进防护。它们通过集成的威胁防护、统的安全…

微信小程序 npm构建+vant-weaap安装

微信小程序&#xff1a;工具-npm构建 报错 解决&#xff1a; 1、新建miniprogram文件后&#xff0c;直接进入到miniprogram目录&#xff0c;再次执行下面两个命令&#xff0c;然后再构建npm成功 npm init -y npm install express&#xff08;Node js后端Express开发&#xff…

初出茅庐的小李博客之使用立创开发板(ESP32)连接到EMQX Platform【MQTT TLS/SSL 端口连接】

介绍 手上有一块立创开发板&#xff0c;本着不吃灰的原则把它用起来&#xff0c;今天就来用它来连接上自己部署的MQTT服务器进行数据通信。 硬件&#xff1a;立创开发板 开发环境&#xff1a;Arduino IDE Win11 MQTT 平台&#xff1a;EMQX Platform 立创开发板介绍&#xff1…

ChatGPT AI专题资料合集【65GB】

介绍 ChatGPT & AI专题资料合集【65GB】 &#x1f381;【七七云享】资源仓库&#xff0c;海量资源&#xff0c;无偿分享√

OSError: [Errno 117] Structure needs cleaning

一 问题描述 OSError: [Errno 117] Structure needs cleaning: /tmp/pymp-wafeatri 我重新使用SSH登录也会提示这个类似问题 二 解决方法 2.1 尝试删除报错的文件 &#xff08;想直接看最终解决方法的可忽略此处&#xff09; sudo rm -rf /tmp/pymp-wafeatri 此种方法只能保证…

手机怎么投屏?值得收藏的5个投屏软件(2024全新)

在大屏幕上观看自己喜欢的电影、电视节目和其他媒体节目总是一种很棒的体验。因此&#xff0c;如果你正在寻找通过无线网络或USB数据线在windows或mac电脑或笔记本电脑上屏幕镜像、投屏到电脑显示屏上的指南&#xff0c;那么可以花3分钟时间往下看看。在本文中&#xff0c;小编…

现在,所有人都能免费用GPT-4o了!

OpenAI今日官宣&#xff0c;ChatGPT正式向所有用户免费开放&#xff01;所有用户均可以访问定制化GPT、分析图表、询问有关照片的问题以及5月初GPT-4o添加的其他功能。 OpenAI今天在X上发布推文&#xff1a; 「所有ChatGPT免费用户现在都可以使用浏览、视觉、数据分析、文件上…

CSS+Canvas绘制最美星空(一闪一闪亮晶晶效果+流星划过)

1.效果 2.代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><style>body,html {margin: 0;padding: 0;ov…

tree2retriever:面向RAG场景的递归摘要树检索器实现

tree2retriever 面向RAG场景的递归摘要树检索器实现 Recursive Abstractive Processing for Tree-Organized Retrieval Github:https://github.com/yanqiangmiffy/tree2retriever Example import logging import picklefrom tree2retriever.cluster_tree_builder import Clus…

整理GTX收发器示例工程(高速收发器十一)

前文分析了xilinx官方提供的GTX IP示例工程&#xff0c;该代码的结构比较混乱&#xff0c;本文将该代码进行梳理&#xff0c;形成一个便于使用的模块&#xff0c;后续如果要使用多通道的收发器&#xff0c;多次例化某个模块就行了。 下图是官方例程中GTX IP相关模块的RTL视图&a…

Redis用GEO实现附近的人功能

文章目录 ☃️概述☃️命令演示☃️API将数据库表中的数据导入到redis中去☃️实现附近功能 ☃️概述 GEO就是Geolocation的简写形式&#xff0c;代表地理坐标。Redis在3.2版本中加入了对GEO的支持&#xff0c;允许存储地理坐标信息&#xff0c;帮助我们根据经纬度来检索数据。…

万界星空科技MES系统功能介绍

制造执行系统或MES 是一个全面的动态软件系统&#xff0c;用于监视、跟踪、记录和控制从原材料到成品的制造过程。MES在企业资源规划(ERP) 和过程控制系统之间提供了一个功能层&#xff0c;为决策者提供了提高车间效率和优化生产所需的数据。 万界星空科技MES 系统基础功能&am…

美国心理协会(APA)文献去哪里查找下载

今天讲一个关于心理学的数据库——美国心理协会&#xff08;APA&#xff09;数据库 PsycARTICLES&#xff08;心理学全文数据库&#xff0c;简称PA&#xff09;&#xff0c;收录美国心理学协会&#xff08;American Psychological Association&#xff0c;简称APA&#xff09;…

Android 图表开发开源库 MPAndroidChart 使用总结

1. 引言 电视项目中需要一个折线图表示节电数据变化情况&#xff0c;类比 H5 来说&#xff0c;Android 中也应该有比较成熟的控件&#xff0c;经过调研后&#xff0c;发现 MPAndroidChart 功能比较强大&#xff0c;网上也有人说可能是目前 Android 开发最好用的一个三方库了&a…

玩机进阶教程------修改gpt.bin分区表地址段 完全屏蔽系统更新 fast刷写分区表 操作步骤解析【二】

上期博文简单说明了分区表的基本常识。我们在有些环境中需要屏蔽手机的系统更新选项。除了以前博文中说明的修改系统更新下载文件夹的方法。还可以通过修改分区表类达到目的。在一些辅助维修工具上面带修改分区表功能。修改后效果为屏蔽系统更新和可以恢复出厂。原则上不深刷都…

kafka学习笔记06

Kafka数据存储流程和log日志讲解 讲解分布式应用核心CAP知识 Kafka数据可靠性保证原理之副本机制Replica介绍《上》 Kafka数据可靠性保证原理之副本机制Replica介绍《下》 Kafka数据可靠性保证原理之ISR机制讲解 Kafka的HighWatermark的作用你知道多少