当前位置: 首页 > news >正文

【PTA数据结构 | C语言版】左堆的合并操作

本专栏持续输出数据结构题目集,欢迎订阅。

文章目录

    • 题目
    • 代码

题目

请将给定数据顺次插入初始为空的左堆,用此法建立两个左堆,再将两堆合并。为了验证结果的正确性,输出结果堆的前序和中序遍历序列。

输入格式:
输入先后给出两个堆的元素。每个堆元素输入的格式为:首先在一行中给出正整数 n(≤1000),即元素个数;随后一行给出 n 个元素的整数键值,范围不超过 int 型整数。

输出格式:
首先按照前序遍历、其次按照中序遍历,输出合并后堆的元素,格式为:每个元素占一行,以 key:npl 输出每个树结点的键值和空路径长度(即NPL)。

输入样例:
8
17 26 8 3 10 21 14 23
8
7 37 18 6 12 18 24 33

输出样例:
3:3
6:3
7:2
37:1
18:1
8:2
12:2
18:1
23:1
24:1
33:1
17:1
26:1
10:2
21:1
14:1
37:1
7:2
18:1
6:3
18:1
12:2
33:1
24:1
23:1
8:2
26:1
17:1
3:3
21:1
10:2
14:1

代码

#include <stdio.h>
#include <stdlib.h>// 定义左堆节点结构
typedef struct TreeNode *LeftHeap;
struct TreeNode {int key;        // 键值int npl;        // 零路径长度LeftHeap left;  // 左子树LeftHeap right; // 右子树
};// 创建新节点
LeftHeap CreateNode(int key) {LeftHeap newNode = (LeftHeap)malloc(sizeof(struct TreeNode));newNode->key = key;newNode->npl = 1;  // 叶子节点的NPL为1,不是0newNode->left = NULL;newNode->right = NULL;return newNode;
}// 交换左右子树
void SwapChildren(LeftHeap H) {LeftHeap temp = H->left;H->left = H->right;H->right = temp;
}// 合并两个左堆
LeftHeap Merge(LeftHeap H1, LeftHeap H2) {if (H1 == NULL) return H2;if (H2 == NULL) return H1;// 确保H1的键值小于等于H2的键值if (H1->key > H2->key) {LeftHeap temp = H1;H1 = H2;H2 = temp;}// 将H2合并到H1的右子树H1->right = Merge(H1->right, H2);// 确保左子树的NPL大于等于右子树的NPLif ((H1->left == NULL) || (H1->left->npl < H1->right->npl)) {SwapChildren(H1);}// 更新NPL值if (H1->right == NULL) {H1->npl = 1;  // 只有左子树时,NPL为1} else {H1->npl = H1->right->npl + 1;  // NPL为右子树NPL+1}return H1;
}// 插入节点到左堆
LeftHeap Insert(LeftHeap H, int key) {LeftHeap newNode = CreateNode(key);return Merge(H, newNode);
}// 前序遍历
void PreOrder(LeftHeap H) {if (H != NULL) {printf("%d:%d\n", H->key, H->npl);PreOrder(H->left);PreOrder(H->right);}
}// 中序遍历
void InOrder(LeftHeap H) {if (H != NULL) {InOrder(H->left);printf("%d:%d\n", H->key, H->npl);InOrder(H->right);}
}int main() {LeftHeap H1 = NULL, H2 = NULL;int n, key;int i;// 读取第一个堆的数据scanf("%d", &n);for (i = 0; i < n; i++) {scanf("%d", &key);H1 = Insert(H1, key);}// 读取第二个堆的数据scanf("%d", &n);for (i = 0; i < n; i++) {scanf("%d", &key);H2 = Insert(H2, key);}// 合并两个堆LeftHeap mergedHeap = Merge(H1, H2);// 输出前序遍历PreOrder(mergedHeap);// 输出中序遍历InOrder(mergedHeap);return 0;
}
http://www.dtcms.com/a/285634.html

相关文章:

  • 异世界历险之数据结构世界(排序(插入,希尔,堆排))
  • Webpack 项目优化详解
  • uniapp微信小程序 实现swiper与按钮实现上下联动
  • 技术演进中的开发沉思-38 MFC系列:关于打印
  • 微信小程序 wx.request() 的封装
  • 为Notepad++插上JSON格式化的翅膀
  • Git 团队协作完全指南:从基础到高级应用
  • 《向华为学创新》:123页破解华为创新密码【附全文阅读】
  • Jfinal+SQLite解决MYSQL迁移表未复制索引问题,完善迁移工具
  • 私有服务器AI智能体搭建-大模型选择优缺点、扩展性、可开发
  • 数组/链表/【环形数组】实现 队列/栈/双端队列【移动语义应用】【自动扩缩】
  • st-Gcn训练跳绳识别模型六:YOLOv8-Pose 和 ST-GCN 实现实时跳绳计数器应用
  • IDEA 2020.1版本起下载JDK
  • 当OT遇见IT:Apache IoTDB如何用“时序空间一体化“技术破解工业物联网数据孤岛困局?
  • 【每日算法】专题十三_队列 + 宽搜(bfs)
  • 四、CV_GoogLeNet
  • 代码训练营DAY35 第九章 动态规划part03
  • 【收集电脑信息】collect_info.sh
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 基于jieba实现词频统计
  • Kubernetes Pod深度理解
  • 【数据可视化-67】基于pyecharts的航空安全深度剖析:坠毁航班数据集可视化分析
  • 【问题解决】npm包下载速度慢
  • 【AI大模型学习路线】第三阶段之RAG与LangChain——第十八章(基于RAGAS的RAG的评估)RAG中的评估思路?
  • 把握流程节点,明确信息传递
  • C专题5:函数进阶和递归
  • 最小生成树算法详解
  • 2025外卖江湖:巨头争霸,谁主沉浮?
  • 洞见AI时代数据底座的思考——YashanDB亮相2025可信数据库发展大会
  • NIO网络通信基础
  • AndroidX中ComponentActivity与原生 Activity 的区别