Problem C: 算法9-9~9-12:平衡二叉树的基本操作

news2024/11/23 12:15:21

Problem Description

平衡二叉树又称AVL树,它是一种具有平衡因子的特殊二叉排序树。平衡二叉树或者是一棵空树,或者是具有以下几条性质的二叉树:

1.       若它的左子树不空,则左子树上所有结点的值均小于它的根节点的值;

2.       若它的右子树不空,则右子树上所有结点的值均大于它的根节点的值;

3.       它的左右子树也分别为平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。

若将二叉树上结点的平衡因子定义为该结点的左子树深度减去它的右子树的深度,则平衡二叉树上的所有结点的平衡因子只可能为-1、0和1。只要二叉树上有一个结点的平衡因子的绝对值大于1,则这棵二叉树就是不平衡的。

通过平衡二叉树的性质不难得知,其插入、删除、查询都操作的时间复杂度均为O(log2n)。

维持平衡二叉树性质的操作可以被称为旋转。其中平衡二叉树的右旋处理可以描述如下:

 而其左旋处理与右旋正好相反,可以描述如下:

 在本题中,读入一串整数,首先利用这些整数构造一棵平衡二叉树。另外给定多次查询,利用构造出的平衡二叉树,判断每一次查询是否成功。

 

 Input Description

 

输入的第一行包含2个正整数n和k,分别表示共有n个整数和k次查询。其中n不超过500,k同样不超过500。

第二行包含n个用空格隔开的正整数,表示n个整数。

第三行包含k个用空格隔开的正整数,表示k次查询的目标。

 

 Output Description

 

只有1行,包含k个整数,分别表示每一次的查询结果。如果在查询中找到了对应的整数,则输出1,否则输出0。

请在每个整数后输出一个空格,并请注意行尾输出换行。

Sample Input

8 3
1 3 5 7 8 9 10 15
9 2 5

 Sample Output

1 0 1 

 Hint

在本题中,首先需要按照题目描述中的算法完成平衡二叉树的构造过程,之后需要通过在平衡二叉树中的不断向下查找,将需要查询的值与当前节点的值进行比较,直到确定被查询的值是否存在。

通过课本中的性能分析部分,不难发现平衡二叉树的查找、插入、删除等操作的时间复杂度均为O(log2n),这是通过利用旋转操作使二叉树保持平衡状态而保证的。

 我的想法:

 我的代码:

#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;

typedef struct Node
{
	int v, height;
	Node * lchild, *rchild;
}Node, *TNode;

int GetHeight(TNode &Tree)//获取当前节点的高度
{
	if (Tree == NULL)
	{
		return 0;
	}
	return Tree->height;
}

void UpdateHeight(TNode &Tree)
{
	Tree->height = max(GetHeight(Tree->lchild), GetHeight(Tree->rchild)) + 1;
	//树高为左右子树中的最大值加一
}

int GetTreeHeight(TNode &Tree)//获取左右节点高度差
{
	return GetHeight(Tree->lchild) - GetHeight(Tree->rchild);
}

void L(TNode &Tree)//左旋
{
	TNode temp = Tree->rchild;//记录Tree的右孩子
	Tree->rchild = temp->lchild;//改变树的右孩子为树右孩子的右孩子
	temp->lchild = Tree;///
	UpdateHeight(Tree);
	UpdateHeight(temp);
	Tree = temp;
}

void R(TNode &Tree)//右旋
{
	TNode temp = Tree->lchild;
	Tree->lchild = temp->rchild;
	temp->rchild = Tree;
	UpdateHeight(Tree);
	UpdateHeight(Tree);
	Tree = temp;
}

void Inster(TNode &Tree, int e)
{
	if (Tree == NULL)
	{
		TNode temp = new Node;               //创建一个新的节点,并用temp指向这个节点
		temp->v = e;                         //赋予该树权值
		temp->lchild = temp->rchild = NULL;  //左右孩子置为空
		temp->height = 1;                    //树高为1
		Tree = temp;
		return;
	}
	if (e < Tree->v)//要擦入的元素小于根元素
	{
		Inster(Tree->lchild, e); //看左孩子
		UpdateHeight(Tree);      //更新一下树高
		if (GetTreeHeight(Tree) == 2)//左右子树树高相差为2
		{
			if (GetTreeHeight(Tree->lchild) == 1)//右子树的左右孩子树高相差为1
			{
				R(Tree);
			}
			else if(GetTreeHeight(Tree->lchild) == -1)
			{
				L(Tree->lchild);
				R(Tree);
			}

		}
	}
	else if(e > Tree->v)//大于要插入的元素
	{
		Inster(Tree->rchild, e);//看右孩子
		UpdateHeight(Tree);//再次更新树高
		if (GetTreeHeight(Tree) == -2)
		{
			if (GetTreeHeight(Tree->rchild) == -1)//RR型
			{
				L(Tree);
			}
			else if(GetTreeHeight(Tree->rchild) == 1)//RL型
			{
				R(Tree->rchild);
				L(Tree);
			}
		}
	}
}


TNode CreateTree(int n)
{
	int e = 0;
	TNode Tree = NULL;

	//初始化树
	for (int i = 0; i < n; i++)
	{
		cin >> e;
		Inster(Tree, e);
	}
	return Tree;
}

int Search(TNode &Tree, int e)
{
	if (Tree == NULL)
	{
		return 0;
	}
	else if (Tree->v == e)
	{
		return 1;
	}
	else if (Tree->v < e)
	{
		Search(Tree->rchild, e);
	}
	else
	{
		Search(Tree->lchild, e);
	}
}

int main()
{
	int n, k;
	cin >> n >> k;//n表示有n个整数,k表示有k个操作

	//先来构建二叉树
	TNode root = CreateTree(n);

	int ch;//ch是要匹配的数
	while (k--)
	{
		cin >> ch;//匹配成功输出1,失败输出0
		printf("%d ", Search(root, ch));
	}
	printf("\n");
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaSE笔记——内部类

文章目录前言一、创建内部类二、链接外部类三、使用.this 和.new四、内部类与向上转型五、内部类方法和作用域六、匿名内部类七、嵌套类1. 接口内部的类2. 从多层嵌套类中访问外部类的成员八、继承内部类九、局部内部类总结前言 一个定义在另一个类中的类&#xff0c;叫作内部…

AUTO-CUT安装。

auto cut 是李沐老师分享的视频剪辑工具wisper。 这我非常需要啊。 所以看看怎么安装。 先下载客户端。和ffmpeg 链接&#xff1a;https://pan.baidu.com/s/1EZomUtV8Y_es8crR6-r3GQ 提取码&#xff1a;lgky 解压安装autocut客户端。 还需要ffmpeg和环境。 环境配置是自动…

事业编上岸浙大mpa的个人经验总结

先来介绍下我的个人情况吧&#xff0c;我是2022级浙大MPA项目的一名新生&#xff0c;也是一名中学老师&#xff0c;定居在杭州&#xff0c;毕业于湖州师范学院&#xff0c;在学校主要是负责教研这一块的工作&#xff0c;因为工作需要的原因&#xff0c;在综合了解了几个项目后&…

测试工具Hercules

下载地址&#xff1a;Hercules SETUP utility | HW-group.com Hercules SETUP实用程序是有用的串行端口终端&#xff08;RS-485或RS-232终端&#xff09;、UDP/IP终端和TCP/IP客户端服务器终端。它只为硬件组内部使用而创建&#xff0c;但今天它在一个实用程序中包含了许多功能…

手把手刷算法项目fucking-algorithm,干翻算法

今天给大家分享一个开源项目&#xff0c;在 GitHub 排行榜上今天特别火&#xff0c;都爬到了日排行榜的第二名。 大家想知道&#xff0c;面试互联网大厂&#xff0c;必面的是什么吗&#xff1f;当然是算法。作为程序员&#xff0c;互联网大厂的面试&#xff0c;算法是最重要的…

用javascript分类刷leetcode10.递归分治(图文视频讲解)

递归三要素 递归函数以及参数递归终止条件递归单层搜索逻辑 递归伪代码模版&#xff1a; function recursion(level, param1, param2, ...) {//递归终止条件if (level > MAX_LEVEL) {// output resultreturn;}//处理当前层process_data(level, data, ...);//进入下一层re…

10_缓存-2_二级缓存

二级缓存是以namespace为标记的缓存&#xff0c;可以是由一个SqlSessionFactory创建的SqlSession之间共享缓存数据。默认并不开启。下面的代码中创建了两个SqlSession&#xff0c;执行相同的SQL语句&#xff0c;尝试让第二个SqlSession使用第一个SqlSession查询后缓存的数据。要…

CTF Misc(1)图片隐写基础以及原理,覆盖了大部分题型

前言 在ctf比赛中&#xff0c;misc方向是必考的一个方向&#xff0c;其中&#xff0c;图片隐写也是最常见的题目类型&#xff0c;在本篇文章中&#xff0c;将教授以下内容 1.各种图片文件的头数据以及判断是什么类型的图片 2.png图片隐写 3.jpg图片隐写 4.gif图片隐写 5.bmp图…

Android---RecyclerView实现吸顶效果

目录 一、ItemDecoration 二、实现RecyclerView吸顶效果 1、实现一个简单的RecyclerView。 2、通过ItemDecoration画分割线 3、画出每个分组的组名 4、实现吸顶效果 完整demo 一、ItemDecoration ItemDecoration 允许应用给具体的 View 添加具体的图画或者 layout 的偏移…

论文投稿指南——中文核心期刊推荐(物理学)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

[附源码]计算机毕业设计Python的高校课程知识库(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

如何做好源代码防泄密

​ 一、前言 • 各类嵌入式研发及平台软件研发行业&#xff0c;都有自己的核心数据以及核心文档&#xff0c;用户数据等敏感信息&#xff0c;这些信息数据有以下共性&#xff1a; –属于核心机密资料&#xff0c;万一泄密会给造成恶劣影响 –核心数据类型多&#xff0c;有…

验证码是自动化的天敌?看看大神是怎么解决的

01 验证码 1、什么是验证码&#xff1a; 指一种随机生成的信息&#xff08;数字、字母、汉字、图片、算术题&#xff09;等为了防止恶意的请求行为&#xff0c;增加应用的安全性 自动化过程中也是需要进行注册或者登陆的操作&#xff0c;所以需要处理验证 2、验证码处理方式…

《第一堂棒球课》:MLB棒球创造营·棒球名人堂

铃木一朗&#xff0c;1973年10月22日出生于西春日井郡丰山町&#xff08;日本&#xff09;&#xff0c;日本职业棒球运动员&#xff0c;效力于美国职棒大联盟西雅图水手队。 1991年被欧力士蓝浪以第四指名选中&#xff0c;1994年以片假名&#xff08;Ichiro&#xff09;在一军…

记录一次并发问题的解决

并发问题的产生背景 该问题是在生产运行的过程中出现的。这个运行的项目是一个拉取第三方数据的一个服务&#xff0c;该服务会在拉取到数据之后直接将该数据直接插入到本地库&#xff0c;其中插入本地库的操作是调用的一个静态方法&#xff0c;静态方法对数据进行了多次数据处…

携程Apollo配置中心架构介绍

俗话说”麻雀虽小&#xff0c;五脏俱全“&#xff0c;有人说想看开源源码却不知道什么好&#xff0c;事实上&#xff0c;那些流行多年&#xff0c;广受好评的开源工程都是很值得一读的。今天我们介绍Apollo配置中心的基本情况&#xff0c;之所以介绍这个&#xff0c;主要是因为…

在线地图持续进化,BAT技术“鲜”发制人

配图来自Canva可画 眼下&#xff0c;在线地图正在成为智能穿戴、物流运输、旅游度假等诸多领域的“基础设施”&#xff0c;尤其是自动驾驶、车路协同等汽车细分赛道越来越重视在线地图的导入。 得益于此&#xff0c;在线地图市场持续走向火热。华经产业研究院数据显示&#x…

linux基础学习-ssh基础

ssh基础 通过SSH客户端我们可以连接到运行了SSH服务器的远程机器上 SSH客户端是一种使用Secure Shell(SSH)协议连接到远程计算机的软件程序目前较为可靠&#xff0c;专门为远程登录会话和其他网络服务提供安全性的协议 利用SSH协议可以有效防止远程管理过程中的信息泄露提供SS…

行业级开源无人机目标追踪,高空助力抓贼!

活久见&#xff01;成都一高楼惊险无人机抓小偷视频中危险动作&#xff0c;请勿模仿&#xff01; 本次实验中我们使用的是Prometheus 600&#xff08;P600&#xff09;行业级无人机研发平台&#xff08;此平台适用于无人机行业应用开发与室外环境下的无人机算法验证&#xff0…

White Rose设计与架构的想法分享

在七牛云校园黑客马拉松中&#xff0c;一款设计优秀、逻辑清晰的白板作品脱颖而出&#xff0c;获得第二名的好成绩&#xff0c;这就是来自郑州大学Since团队的White Rose白板&#xff0c;以下是他们的设计和架构分享。 一、前言 White Rose是参加七牛云hackathon比赛的作品&am…