文章目录

  • 单选题
    • 选择题题解
  • 编程题
    • 7-3 插入排序还是堆排序 (25分) 不会
      • 输入格式:
      • 输出格式:
      • 输入样例 1:
      • 输出样例 1:
      • 输入样例 2:
      • 输出样例 2:
    • 代码
    • 7-4 愿天下有情人都是失散多年的兄妹 (25分)
      • 输入格式:
      • 输出格式:
      • 输入样例:
      • 输出样例:
    • 代码

单选题

题号 题目 答案
1 AVL树是一种平衡的二叉搜索树,树中任一结点具有下列哪一特性: 左、右子树高度差的绝对值不超过1
2 C
3 在下列所示的平衡二叉树中,插入关键字48后得到一棵新平衡二叉树。在新平衡二叉树中,关键字37所在结点的左、右子结点中保存的关键字分别是: 24、53
4 12个结点的AVL树的最大深度是? 5
5 若AVL树的深度是6(空树的深度定义为-1),则该树的最少结点数是: 33
6 将 8, 9, 7, 2, 3, 5, 6, 4 顺序插入一棵初始为空的AVL树。下列句子中哪句是错的? C
7 将一系列数字顺序一个个插入一棵初始为空的AVL树。下面哪个系列的第一次旋转是“右-左”双旋? D
8 将 1, 2, 3, 6, 5, 4 顺序一个个插入一棵初始为空的AVL树,会经历下列哪些旋转? 一个“右-右”旋和两个“右-左”旋
9 A
10 首先将 28, 23, 54, 61, 98, 37 插入一棵初始为空的平衡二叉树(AVL树),然后马上插入下列选项中的一个键值。哪个键值将引起 RL 旋转? 70

选择题题解

2、如图所示

3、转的过程:

  • 插入48之后属于右左双旋转的情况,按照图示的方法先做右单旋转,再做左单旋转
  • 右单旋转:以37为轴,53顺时针旋转(向下),原本是37左孩子的48成为53的左孩子
  • 24的右孩子由53变为37
  • 左单旋转:仍然以37为轴,24逆时针旋转(向下),成为37的左孩子
    24的左子树高度为1,右字数高度为3,属于RL型,RL型的变化就这么做的,具体RL型解释如下

    具体的RL型的旋转规则,大佬说记住就可以了,哎拼命记吧。

    从第四题之后都暂时不会,望各位大佬留言赐教,补充题解

编程题

7-3 插入排序还是堆排序 (25分) 不会

根据维基百科的定义:

插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。

堆排序也是将输入分为有序和无序两部分,迭代地从无序部分找出最大元素放入有序部分。它利用了大根堆的堆顶元素最大这一特征,使得在当前无序区中选取最大元素变得简单。

现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?

输入格式:

输入在第一行给出正整数 N (≤100);随后一行给出原始序列的 N 个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。

输出格式:

首先在第 1 行中输出Insertion Sort表示插入排序、或Heap Sort表示堆排序;然后在第 2 行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行首尾不得有多余空格。

输入样例 1:

10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0

输出样例 1:

Insertion Sort
1 2 3 5 7 8 9 4 6 0

输入样例 2:

10
3 1 2 8 7 5 9 4 6 0
6 4 5 1 0 3 2 7 8 9

输出样例 2:

Heap Sort
5 4 3 1 0 2 6 7 8 9

代码

#include<bits/stdc++.h>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
const int maxn = 2e4+100;
int a[maxn];
int b[maxn];
void cal(int l,int r){int i=l,j=i*2;while(j<=r){if(j+1<=r&&b[j]<b[j+1])j++;if(b[j]>b[i]){swap(b[i],b[j]);i=j;j=i*2;}elsebreak;}
}
int main()
{int n;scanf("%d",&n);for(int i=1; i<=n; i++){scanf("%d",&a[i]);}for(int i=1; i<=n; i++){scanf("%d",&b[i]);}int flag=-1;int i;for( i=1; i<=n; i++){if(i==1)continue;else if(b[i]>=b[i-1])continue;else{flag=i;break;}}if(flag!=2){sort(b+1,b+flag+1);printf("Insertion Sort\n");for(int i=1; i<=n; i++){if(i==1)printf("%d",b[i]);elseprintf(" %d",b[i]);}printf("\n");}else{printf("Heap Sort\n");int pos=n;while(pos>=2&&b[pos]>b[pos-1])pos--;swap(b[1],b[pos]);cal(1,pos-1);for(int i=1; i<=n; i++){if(i==1)printf("%d",b[i]);elseprintf(" %d",b[i]);}printf("\n");}return 0;
}

7-4 愿天下有情人都是失散多年的兄妹 (25分)

呵呵。大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人、父母、祖父母、曾祖父母、高祖父母)则不可通婚。本题就请你帮助一对有情人判断一下,他们究竟是否可以成婚?

输入格式:

输入第一行给出一个正整数N(2 ≤ N ≤10​4​​ ),随后N行,每行按以下格式给出一个人的信息:

本人ID 性别 父亲ID 母亲ID

其中ID是5位数字,每人不同;性别M代表男性、F代表女性。如果某人的父亲或母亲已经不可考,则相应的ID位置上标记为-1。

接下来给出一个正整数K,随后K行,每行给出一对有情人的ID,其间以空格分隔。

注意:题目保证两个人是同辈,每人只有一个性别,并且血缘关系网中没有乱伦或隔辈成婚的情况。

输出格式:

对每一对有情人,判断他们的关系是否可以通婚:如果两人是同性,输出Never Mind;如果是异性并且关系出了五服,输出Yes;如果异性关系未出五服,输出No

输入样例:

24
00001 M 01111 -1
00002 F 02222 03333
00003 M 02222 03333
00004 F 04444 03333
00005 M 04444 05555
00006 F 04444 05555
00007 F 06666 07777
00008 M 06666 07777
00009 M 00001 00002
00010 M 00003 00006
00011 F 00005 00007
00012 F 00008 08888
00013 F 00009 00011
00014 M 00010 09999
00015 M 00010 09999
00016 M 10000 00012
00017 F -1 00012
00018 F 11000 00013
00019 F 11100 00018
00020 F 00015 11110
00021 M 11100 00020
00022 M 00016 -1
00023 M 10012 00017
00024 M 00022 10013
9
00021 00024
00019 00024
00011 00012
00022 00018
00001 00004
00013 00016
00017 00015
00019 00021
00010 00011

输出样例:

Never Mind
Yes
Never Mind
No
Yes
No
Yes
No
No

代码

#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int Inf = 1e5 + 5;
vector<int> vec[Inf];     // 存关系图
bool vis[Inf];              // 标记五服以内的亲属
char sex[Inf];              // 记录性别
bool flag;                  // 标记情侣是否为近亲
void Dfs(int x, int num)    // num表示第几代,从0开始
{if (num >= 4)          // 超过五代直接退出 return;for (int i = 0; i < vec[x].size(); i++){if (!vis[vec[x][i]]){vis[vec[x][i]] = 1;  // 标记出现的人 Dfs(vec[x][i], num + 1);}elseflag = 1;      //五服之内出现一样的人 }
}
int main()
{int T;cin >> T;while (T--){int t, fa, ma;char ch;scanf("%d ", &t);sex[t] = getchar();scanf(" %d %d", &fa, &ma);if (fa != -1)       // -1不用保存,避免数据处理不当导致数组越界 {vec[t].push_back(fa); // 保存双亲 sex[fa] = 'M';    // 记录父亲性别 }if (ma != -1){vec[t].push_back(ma);sex[ma] = 'F';}}cin >> T;while (T--){int x, y;scanf("%d %d", &x, &y);if (sex[x] == sex[y])  // 同性 cout << "Never Mind" << endl;else{memset(vis, 0, sizeof(vis));  // 每次都初始化一下,每个人的五服亲戚不一样vis[x] = 1;vis[y] = 1;flag = 0;Dfs(x, 0);Dfs(y, 0);if (flag)   // 被标记过说明这两人为近亲 cout << "No" << endl;elsecout << "Yes" << endl;}}return 0;
}

数据结构——平衡二叉树PTA习题(很多不会的,求大佬帮忙写题解)相关推荐

  1. 数据结构---平衡二叉树

    数据结构-平衡二叉树 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> typedef struct avlTree { ...

  2. 用c语言编译二叉树,C语言 数据结构平衡二叉树实例详解

    数据结构平衡二叉树 参考代码如下: /* 名称:平衡二叉树 语言:数据结构C语言版 编译环境:VC++ 6.0 日期: 2014-3-26 */ #include #include #include ...

  3. [PTA]习题9-3 平面向量加法

    [PTA]习题9-3 平面向量加法 本题要求编写程序,计算两个二维平面向量的和向量. 输入格式: 输入在一行中按照"x₁ y₁ x₂ y₂"的格式给出两个二维平面向量v₁ = (x ...

  4. 数据结构——平衡二叉树的的旋转问题

    在学习有关数据结构平衡二叉树的时候,我就特别困惑在二叉查找树中是如何将树旋转和交换孩子的.这里,我将自己的总结写下来,喜欢大家一起交流进步!        这个需要旋转的情况大体可以·分为4种情况.分 ...

  5. 大一下|数据结构十大习题|part1

    大一下|数据结构十大习题 前言 一.一元多项式运算 实验内容: 相关知识及解题思路: 代码框架及实现: 二.迷宫探索 前言(动态内存分配c++语法): 实验内容: 相关知识及解题思路: 代码框架及实现 ...

  6. PTA 基础编程题目集 6-6 求单链表结点的阶乘和

    PTA 基础编程题目集 6-6 求单链表结点的阶乘和 本题要求实现一个函数,求单链表L结点的阶乘和.这里默认所有结点的值非负,且题目保证结果在int范围内. 函数接口定义: int Factorial ...

  7. PTA 基础编程题目集 7-21 求特殊方程的正整数解 C语言

    PTA 基础编程题目集 7-21 求特殊方程的正整数解 C语言 输入样例1: 884 输出样例1: 10 28 20 22 输入样例2: 11 输出样例2: No Solution #include& ...

  8. PTA 基础编程题目集 7-16 求符合给定条件的整数集 C语言

    PTA 基础编程题目集 7-16 求符合给定条件的整数集 C语言 给定不超过6的正整数A,考虑从A开始的连续4个数字.请输出所有由它们组成的无重复数字的3位数. 输入格式: 输入在一行中给出A. 输出 ...

  9. PTA 基础编程题目集 7-14 求整数段和 C语言

    PTA 基础编程题目集 7-14 求整数段和 C语言 给定两个整数A和B,输出从A到B的所有整数以及这些数的和. 输入格式: 输入在一行中给出2个整数A和B,其中−100≤A≤B≤100,其间以空格分 ...

最新文章

  1. 如何用OKR搞垮一个团队?
  2. 集成“PDF预览”和“页面翻译”的亿简浏览器0.5.0 alpha
  3. 【BZOJ3772】精神污染
  4. 有意思的BAT CMD if while循环 整型自增
  5. 财经数据提取器上线拉
  6. 线性代数:线性方程组的解
  7. Java常量设计与常量池
  8. birt插件 web_birt 集成到现有的web应用中
  9. Hutool介绍(详)
  10. 聊天ai机器人_适用于您网站的14种最佳AI聊天机器人软件(已比较)
  11. 免费url长网址缩短压缩工具评测,短链接在线生成器推荐。
  12. 无需写代码,又一个数据动态图制作利器
  13. 邹小强老师的个人目标管理分享课
  14. 985助理教授与二本教授哪个水平高?
  15. 计算机毕业设计选题\开题\项目\论文\答辩一套玩转毕业设计
  16. vscode build debug
  17. WCF:学习Artech大哥的入门程序
  18. 三维CAD软件项目即将验收 3D打印获突破
  19. c语言实现FIFO算法和LRU算法,C语言实现FIFO算法与LRU算法
  20. 主板上Usb线序规则

热门文章

  1. CSDN写作技巧记录
  2. 从不合理的防雷接地看监控系统的接地
  3. 前端实现弹幕代码分享
  4. IPv4 IPv6共存技术-----NAT-PT
  5. java切面编程 切面概念,面向切面编程(AOP)初探
  6. 给账户起个“小名”——影子账户全面解析
  7. PBOC/EMV之圈存模式的变革
  8. Unity 3D开发--Shader入门基础
  9. echarts map3d,geo3D以及加柱状图
  10. Android自定义View实现自动无限轮播,点击图片进入详情页