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;
}

三、实验使用环境(本次实验所使用的平台和相关软件)


四、实验步骤和调试过程(实验步骤、测试数据设计、测试结果分析)

题目1:创建二叉树与中序遍历

本机运行截图

题目:哈希表的应用(QQ账户查询)

本机运行截图

PTA提交截图


五、实验小结(实验中遇到的问题及解决过程、实验体会和收获)

遇到的问题及解决方法:

  1. 问题:程序崩溃找不到原因,
    • 解决方法:使用打断点进行调试的方法。
  2. 问题:代码缩进不规范。
    • 解决方法:使用IDE的格式化工具修复代码。

实验体会和收获:

  • 掌握BST树创建
  • 体会BST中的递归应用
  • 掌握哈希表的应用并发现哈希表的高效查找特性
posted @ 2025-04-26 14:48  吴承桓  阅读(52)  评论(0)    收藏  举报