数据结构实验:SDUT2482二叉排序树+3374平衡二叉树

2023-10-12 01:58

本文主要是介绍数据结构实验:SDUT2482二叉排序树+3374平衡二叉树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SDUT3374

平衡二叉树的思路和代码参考清华版《数据结构》,但是对于其中的LR型以及RL型的调整不太明白。虽然书上没有给出右平衡调整的代码但是可以根据左平衡的对称性写出来。

#include<cstdio>
#include<cstring>
#define LH +1
#define RH -1
#define EH 0
using namespace std;
const int maxn=25;
int n,a;
bool taller;
typedef struct BSTNode{int data,bf;struct BSTNode *lch,*rch;
}BSTNode,*BSTree;void R(BSTree &T){BSTree lc=T->lch;T->lch=lc->rch;lc->rch=T;T=lc;
}void L(BSTree &T){BSTree rc=T->rch;T->rch=rc->lch;rc->lch=T;T=rc;
}void LB(BSTree &T){BSTree lc=T->lch;switch(lc->bf){case LH:T->bf=lc->bf=EH;R(T);break;case RH:BSTree rd=lc->rch;switch(rd->bf){case LH:T->bf=RH;lc->bf=EH;break;case EH:T->bf=lc->bf=EH;break;case RH:T->bf=EH;lc->bf=LH;break;}rd->bf=EH;L(T->lch);R(T);}
}void RB(BSTree &T){BSTree rc=T->rch;switch(rc->bf){case RH:T->bf=rc->bf=EH;L(T);break;case LH:BSTree ld=rc->lch;switch(ld->bf){case LH:T->bf=LH;rc->bf=EH;break;case EH:T->bf=rc->bf=EH;break;case RH:T->bf=EH;rc->bf=RH;break;}ld->bf=EH;R(T->rch);L(T);}
}int Insert(BSTree &T,int e,bool &taller){if(!T){T=new BSTNode;T->data=e;T->lch=NULL;T->rch=NULL;T->bf=EH;taller=true;}else{if(T->data==e){taller=false;return 0;}if(e<T->data){if(!Insert(T->lch,e,taller))return 0;if(taller){switch(T->bf){case LH:LB(T);taller=false;break;case EH:T->bf=LH;taller=true;break;case RH:T->bf=EH;taller=false;break;}}}else{if(!Insert(T->rch,e,taller))return 0;if(taller){switch(T->bf){case LH:T->bf=EH;taller=false;break;case EH:T->bf=RH;taller=true;break;case RH:RB(T);taller=false;break;}}}}return 1;
}int main(){while(scanf("%d",&n)!=EOF){BSTree bt=new BSTNode;bt=NULL;taller=false;for(int i=0;i<n;i++){scanf("%d",&a);Insert(bt,a,taller);}printf("%d\n",bt->data);}return 0;
}/***************************************************
User name: Rocky
Result: Accepted
Take time: 0ms
Take Memory: 160KB
Submit time: 2017-11-25 23:58:12
****************************************************/

SDTU2482

#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int maxn=50;
int n;
char a[maxn],b[maxn],a1[maxn],b1[maxn];typedef struct BSTNode{int data;struct BSTNode *lch,*rch;
}BSTNode,*BSTree;int Binsert(BSTree &T,int data){if(!T){BSTree b=new BSTNode;b->data=data;b->lch=NULL;b->rch=NULL;T=b;}else if(data<T->data){Binsert(T->lch,data);}else if(data>T->data){Binsert(T->rch,data);}
}int first(BSTree T,char *a,int i){if(T){first(T->lch,a,i+1);a[i]=T->data;first(T->rch,a,strlen(a)-1);}
}void help(char *s,char *s2){BSTree bt=new BSTNode;bt=NULL;int length=strlen(s);for(int i=0;i<length;i++){Binsert(bt,s[i]);}first(bt,s2,0);
}bool judge(char *a,char *b,int length,int i){while(i<length){if(a[i]==b[i])i++;elsereturn false;}return true;
}int main(){while(scanf("%d",&n)!=EOF){if(n==0)break;scanf("%s",a);int length=strlen(a);help(a,a1);for(int i=0;i<n;i++){scanf("%s",b);help(b,b1);/*for(int i=0;i<length;i++)printf("%c",b1[i]);*/if(judge(a1,b1,length,0))printf("YES\n");elseprintf("NO\n");}}return 0;
}/***************************************************
User name: Rocky
Result: Accepted
Take time: 0ms
Take Memory: 164KB
Submit time: 2017-11-25 20:23:20
****************************************************/


这篇关于数据结构实验:SDUT2482二叉排序树+3374平衡二叉树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/192418

相关文章

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

hdu 1285(拓扑排序)

题意: 给各个队间的胜负关系,让排名次,名词相同按从小到大排。 解析: 拓扑排序是应用于有向无回路图(Direct Acyclic Graph,简称DAG)上的一种排序方式,对一个有向无回路图进行拓扑排序后,所有的顶点形成一个序列,对所有边(u,v),满足u 在v 的前面。该序列说明了顶点表示的事件或状态发生的整体顺序。比较经典的是在工程活动上,某些工程完成后,另一些工程才能继续,此时

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

【软考】希尔排序算法分析

目录 1. c代码2. 运行截图3. 运行解析 1. c代码 #include <stdio.h>#include <stdlib.h> void shellSort(int data[], int n){// 划分的数组,例如8个数则为[4, 2, 1]int *delta;int k;// i控制delta的轮次int i;// 临时变量,换值int temp;in

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

HNU-2023电路与电子学-实验3

写在前面: 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能,设计 8 重 3-1 多路复用器。 3.分析模型机的功能,设计 8 重 2-1 多路复用器。 4.分析模型机的工作原理,设计模型机控制信号产生逻辑。 二、实验内容 1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器; 2.用 VERILOG 语言设计模型机的 8 重 2-1 多