BST树的创建与中序遍历和哈希表的应用
集美大学课程实验报告-实验4:创建二叉树并中序遍历与哈希表的应用
| 项目名称 | 内容 |
|---|---|
| 课程名称 | 数据结构 |
| 班级 | 网安2411 |
| 指导教师 | 郑如滨 |
| 学生姓名 | 吴承桓 |
| 学号 | 202421336026 |
| 实验项目名称 | 创建二叉树并中序遍历与哈希表的应用 |
| 上机实践日期 | 2025/4/26 |
| 上机实践时间 | 2学时 |
一、目的(本次实验所涉及并要求掌握的知识点)
- 掌握BST树的创建与中序遍历
- 掌握哈希表的应用
二、实验内容与设计思想
以下请根据实际情况编写
题目1:二叉树的创建与中序遍历
函数相关伪代码
// 定义二叉树节点结构
结构体 BiTNode {
整型 data;
指针 BiTNode* lchild;
指针 BiTNode* rchild;
}
// 创建新节点
函数 CreateNode(整型 v) 返回 BiTNode*
分配新节点内存
设置节点数据为v
左右子节点初始化为NULL
返回节点指针
// 二叉搜索树查找
函数 SearchBST(指针 BiTree T, 整型 key) 返回 BiTNode*
如果 T 为空 返回 NULL
如果 key 等于 T的数据 返回 T
如果 key 大于 T的数据
递归调用 SearchBST(T的右孩子, key)
否则
递归调用 SearchBST(T的左孩子, key)
// 二叉搜索树插入
函数 InsertBST(引用指针 BiTree& T, 整型 key) 返回 BiTNode*
如果 T 为空
创建新节点
T 指向新节点
返回 T
如果 key 大于 T的数据
递归调用 InsertBST(T的右孩子, key)
否则如果 key 小于 T的数据
递归调用 InsertBST(T的左孩子, key)
否则如果 key 等于 T的数据
直接返回 T
// 创建二叉搜索树
函数 CreateBST() 返回 BiTree
读入初始值x
初始化根节点root为NULL
当 x 不等于 -1 时循环:
调用 InsertBST(root, x)
继续读入x
返回 root
// 中序遍历
函数 InOrder(指针 BiTree b)
如果 b 不为空
递归调用 InOrder(b的左孩子)
输出 b的数据
递归调用 InOrder(b的右孩子)
// 获取树高度
函数 GetHeight(指针 BiTree T) 返回 整型
如果 T 为空 返回 0
计算左子树高度 leftHeight
计算右子树高度 rightHeight
如果 leftHeight 大于等于 rightHeight
返回 leftHeight + 1
否则
返回 rightHeight + 1
// 主程序
主函数
声明 BiTree T
T = 调用 CreateBST()
调用 InOrder(T)
输出换行
输出 "树的高度:" 调用 GetHeight(T)
返回 0
函数代码
#include<iostream>
using namespace std;
typedef int ElemType;
typedef struct BiTNode {
ElemType data;
struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;
BiTNode* CreateNode(int v)
{
BiTNode* node = new BiTNode;
node->data = v;
node->lchild = NULL;
node->rchild = NULL;
return node;
}
//在T上搜索key
BiTNode* SearchBST(BiTree T, ElemType key)
{
if (T == NULL)return NULL;
if (key == T->data)return T;
if (key > T->data)SearchBST(T->rchild, key);
else SearchBST(T->lchild, key);
}
//在T上插入key
BiTNode* InsertBST(BiTree& T, ElemType key)
{
if (T == NULL) {
BiTree node = CreateNode(key);
T = node;
return T;
}
if (key > T->data)
InsertBST(T->rchild, key);
else if (key < T->data)
InsertBST(T->lchild, key);
else if (key == T->data)
return T;
}
BiTree CreateBST()
{
int x;
cin >> x;
BiTree root = NULL;
while (x != -1) {
InsertBST(root, x);
cin >> x;
}
return root;
}
void InOrder(BiTree b) {
if (b != NULL) {
InOrder(b->lchild);
cout << b->data << " ";
InOrder(b->rchild);
}
}
int GetHeight(BiTree T) {
if (T == NULL)
return NULL;
int leftHeight = GetHeight(T->lchild);
int rightHeight = GetHeight(T->rchild);
if (leftHeight >= rightHeight)
return leftHeight + 1;
else if (leftHeight < rightHeight)
return rightHeight + 1;
}
int main()
{
BiTree T;
T = CreateBST();
InOrder(T);
cout << endl;
cout << "树的高度:" << GetHeight(T);
return 0;
}
//50 30 80 20 40 90 10 25 35 85 23 88 -1
题目2:哈希表的应用(QQ账户查询)
函数相关伪代码
算法:QQ账户管理系统
开始:
输入指令数量 N
创建空哈希表 accounts // 用于存储QQ号与密码的映射关系
循环 i 从 1 到 N 执行:
输入 指令类型 cmd、QQ号码 qq、密码 pw
如果 cmd 等于 'N': // 新账户注册
如果 qq 已存在于 accounts 中:
输出 "ERROR: Exist"
否则:
将 qq 和 pw 存入 accounts
输出 "New: OK"
否则如果 cmd 等于 'L': // 账户登录
如果 qq 不存在于 accounts 中:
输出 "ERROR: Not Exist"
否则:
如果 accounts[qq] 等于 pw:
输出 "Login: OK"
否则:
输出 "ERROR: Wrong PW"
结束
函数代码
#include <iostream>
#include <unordered_map>
#include <string>
using namespace std;
int main() {
int N;
cin >> N;
unordered_map<string, string> accounts;
for (int i = 0; i < N; ++i) {
char cmd;
string qq, pw;
cin >> cmd >> qq >> pw;
if (cmd == 'N') {
if (accounts.find(qq) != accounts.end()) {
cout << "ERROR: Exist" << endl;
} else {
accounts[qq] = pw;
cout << "New: OK" << endl;
}
} else if (cmd == 'L') {
auto it = accounts.find(qq);
if (it == accounts.end()) {
cout << "ERROR: Not Exist" << endl;
} else {
if (it->second == pw) {
cout << "Login: OK" << endl;
} else {
cout << "ERROR: Wrong PW" << endl;
}
}
}
}
return 0;
}
三、实验使用环境(本次实验所使用的平台和相关软件)
- 编程语言:C++
- 开发工具:Visual Studio 2022
- 操作系统:Windows 11
四、实验步骤和调试过程(实验步骤、测试数据设计、测试结果分析)
题目1:创建二叉树与中序遍历
本机运行截图

题目:哈希表的应用(QQ账户查询)
本机运行截图

PTA提交截图

五、实验小结(实验中遇到的问题及解决过程、实验体会和收获)
遇到的问题及解决方法:
- 问题:程序崩溃找不到原因,
- 解决方法:使用打断点进行调试的方法。
- 问题:代码缩进不规范。
- 解决方法:使用IDE的格式化工具修复代码。
实验体会和收获:
- 掌握BST树创建
- 体会BST中的递归应用
- 掌握哈希表的应用并发现哈希表的高效查找特性

浙公网安备 33010602011771号