二叉排序树--c++

news2024/11/29 10:39:34

【相关知识】

二叉排序树(也称二叉查找树):或者是一棵空的二叉树,或者是具有下列性质的二叉树:

⑴ 若它的左子树不空,则左子树上所有结点的值均小于根结点的值;

⑵ 若它的右子树不空,则右子树上所有结点的值均大于根结点的值;

⑶ 它的左右子树也都是二叉排序树。

【题目描述】

①给定输入序列,按照二叉排序树算法创建二叉排序树。输出二叉排序树的中序遍历。

②输入一个待查找的整数x,如果整数x在二叉排序树中存在,这输出"Found.",否则输出"Not found."要求按照前序遍历顺序进行递归查找,要输出查找的过程。

③输入一个待查找的整数x,如果整数x在二叉排序树中存在,则输出"Found.",并删除找到的结点,并且输出删除后的二叉排序树的中序遍历序列。如果整数x不存在,否则输出"Not found."。

④然后按后序遍历销毁这棵树。

【测试数据】

【数据1】

请输入二叉树结点个数:

11

请输入结点数据:

38 12 34 56 13 6 98 3 17 40 78

请输入待查找的整数:

40

Searching...

38 56 40

Found.

请输入待删除的结点:

40

Found.

PreOrder sequence after deleted: 38 12 6 3 34 13 17 56 98 78

InOrder sequence after deleted: 3 6 12 13 17 34 38 56 78 98

Destroy tree...

Delete:3
Delete:6
Delete:17
Delete:13
Delete:34
Delete:12
Delete:78
Delete:98
Delete:56
Delete:38

【数据2】

请输入二叉树结点个数:

11

请输入结点数据:

38 12 34 56 13 6 98 3 17 40 78

请输入待查找的整数:

14

Searching...

38 12 34 13 17

Not found.

请输入待删除的结点:

9

Not found.

Destroy tree...

Delete:3
Delete:6
Delete:17
Delete:13
Delete:34
Delete:12
Delete:40
Delete:78
Delete:98
Delete:56
Delete:38

【代码】

#include <iostream>
#include <algorithm>
#include <limits.h>
#include<string>
using namespace std;
const int MAX = 100;
struct BiNode
{
	int data;
	BiNode* lchild, * rchild;//左右儿子指针
};
BiNode* root = NULL;
static bool flag = false;
void inOrder(BiNode* bt)
{
	if (bt == NULL)
		return;
	else
	{
		inOrder(bt->lchild);
		cout << bt->data << " ";
		inOrder(bt->rchild);
	}
}
void preOrder(BiNode* bt)
{
	if (bt == NULL)
		return;
	else
	{
		cout << bt->data << " ";
		preOrder(bt->lchild);
		preOrder(bt->rchild);
	}
}
void release(BiNode* bt)
{
	if (bt != NULL)
	{
		release(bt->lchild);
		release(bt->rchild);
		delete bt;
		bt = NULL;
	}
}
void postOrder(BiNode* bt)
{
	if (bt != NULL)
	{
		postOrder(bt->lchild);
		postOrder(bt->rchild);
		cout << "Delete:" << bt->data << endl;
	}
}
void Insert(BiNode*& bt, int num)
{
	if (bt == NULL)
	{
		bt = new BiNode;
		bt->data = num;
		bt->lchild = NULL;
		bt->rchild = NULL;
	}
	else
	{
		if (num < bt->data)
			Insert(bt->lchild, num);
		else if (num > bt->data)
			Insert(bt->rchild, num);
	}
}
bool Search(BiNode* bt, int key)
{

	if (bt == NULL)
		return false;
	else
	{
		if (key < bt->data)
		{
			cout << bt->data << " ";
			Search(bt->lchild, key);
		}
		else if (key > bt->data)
		{
			cout << bt->data << " ";
			Search(bt->rchild, key);
		}
		else
		{
			cout << bt->data << " ";
			flag = true;
		}
		return flag;
	}
}
//删除结点
void deleteNode(BiNode*& bt)
{
	BiNode* p;
	if (bt->lchild == NULL && bt->rchild == NULL) //叶子结点
	{                                             //直接删除,再把该位置设为空
		p = bt;
		bt = NULL;
		delete p;
	}
	else if (bt->rchild == NULL) //右子树为空,只有左子树
	{
		p = bt;
		bt = bt->lchild;  //把删除结点的左子树拼接到删除节点的父节点的右边,作为父节点的右子树
		delete p;
	}
	else if (bt->lchild == NULL) //左子树为空,只有右子树,同上
	{
		p = bt;
		bt = bt->rchild;
		delete p;
	}
	else  //左右子树都不为空|将要删除结点的左子树中最大的结点替换该删除的结点
	{
		BiNode* parent, * pre;
		parent = bt;
		pre = bt->lchild;
		//转左,然后向右到尽头
		while (pre->rchild)
		{
			parent = pre;
			pre = pre->rchild;

		}
		bt->data = pre->data; //将根节点的左子树中的最大的节点赋给根节点,原本的根节点被替代
		if (parent != bt)
			parent->rchild = pre->lchild;  //pre的lchild与parent建立联系,pre被删掉
		else
			parent->lchild = pre->lchild;  //原来pre指向的结点,也就是最大的结点被删掉
		delete pre;
	}
}

//根据指定的关键数据找到要删除的节点的位置
bool deleteBST(BiNode*& bt, int key)
{
	if (bt == NULL)
	{
		return false;
	}
	else
	{
		if (bt->data == key) //找到关键词
			deleteNode(bt);  //删除
		else if (key < bt->data)  //如果关键词比当前结点数据小,继续在其左子树中查找
			return deleteBST(bt->lchild, key);
		else  //如果关键词比当前结点数据大,在其右子树中查找
			return deleteBST(bt->rchild, key);
		return true;  //查找成功
	}
}

int main()
{
	int n, key;
	int array[MAX] = { 0 };
	cout << "请输入二叉树结点个数:\n";
	cin >> n;
	cout << "请输入结点数据:\n";
	for (int i = 0; i < n; i++)
	{
		cin >> array[i];
	}
	for (int i = 0; i < n; i++)
	{
		Insert(root, array[i]);
	}
	//开始查找
	cout << "请输入待查找的整数:\n";
	cin >> key;
	cout << "Searching..." << endl;
	if (Search(root, key))
		cout << "\nFound." << endl;
	else
		cout << "\nNot found." << endl;

	cout << "请输入待删除的结点:\n";
	cin >> key;
	//开始删除
	if (deleteBST(root, key))
	{
		cout << "Found." << endl;
		cout << "PreOrder sequence after deleted: ";
		preOrder(root);
		cout << "\nInOrder sequence after deleted: ";
		inOrder(root);
	}
	else
		cout << "Not found." << endl;
	//销毁二叉树
	cout << endl << "Destroy tree..." << endl;
	postOrder(root);
	release(root);
	return 0;
}

【运行效果】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1802175.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基本算法-枚举、模拟、递推(上)

目录 递归实现指数型枚举 题目描述 运行代码 代码思路 递归实现组合型枚举 题目描述 运行代码 代码思路 递归实现排列型枚举 题目描述 运行代码 代码思路 递归实现指数型枚举 题目描述 登录—专业IT笔试面试备考平台_牛客网 运行代码 #include<iostream> …

Java装饰器模式,装饰器模式通常通过创建一个接口和一个或多个实现了该接口的类来开始,然后创建装饰器类,这些类也实现了相同的接口

1、定义一个接口Component public interface Component { void operation(); }2、创建一个实现了Component接口的简单类SimpleComponent public class SimpleComponent implements Component { Override public void operation() { System.out.println("SimpleCom…

【JS重点知识05】正则表达式

本文章目标&#xff1a;学习正则表达式概念及语法&#xff0c;编写简单的正则表达式实现字符查找或检测&#xff1b; 一&#xff1a;正则表达式简介 1 什么是正则表达式 是用于匹配字符串中字符组合的模式。在JS中&#xff0c;正则表达式也是对象 2 正则表达式作用 表单验…

【C#】WinForm关闭新(二级)界面使主程序关闭

参考视频&#xff1a;https://www.bilibili.com/video/BV1JY4y1G7jo?p14&vd_source1c57ab1b2e551da5b65c0dfb0f05a493 1.背景介绍 主程序界面&#xff0c;点击弹出二级界面&#xff08;同时隐藏主界面&#xff09;&#xff0c;不做任何设置&#xff0c;这时关闭二级界面…

FM1202,FM020和利时备品

FM1202,FM020和利时备品,统硬件设备、数据库、控制算法、图形、报表&#xff09;和相关系统参数的设置。对整个系统进行监视和控制。操作员站主要完成以下FM1202,FM020和利时备品,各种监视信息的显示、查询和打印&#xff0c;主要有工艺流程图显示、趋势显示、参数列表显示、报…

将二叉排序树转换成双向链表--c++【做题记录】

【问题描述】 编写程序在不增加结点的情况下&#xff0c;将二叉排序树转换成有序双向链表&#xff08;如下图&#xff09;。 链表创建结束后&#xff0c;按照从前往后的顺序输出链表中结点的内容。 【输入输出】 【输入形式】 第一行输入数字n&#xff0c;第二行输入n个整数…

【CS.SE】浅谈: 程序员的职业素养与成长之路

文章目录 1 引言2 持续学习与自我提升2.1 永无止境的学习之路2.2 真实案例&#xff1a;自学Python 3 团队合作与沟通能力3.1 高效沟通是团队成功的基石 4 责任心与职业道德4.1 责任心&#xff1a;代码背后的承诺4.2 真实案例&#xff1a;修复紧急Bug 5 适应变化与快速反应5.1 适…

Linux安装MySQL教程【带图文命令巨详细】

巨详细Linux安装MySQL 1、查看是否有自带数据库或残留数据库信息1.1检查残留mysql1.2检查并删除残留mysql依赖1.3检查是否自带mariadb库 2、下载所需MySQL版本&#xff0c;上传至系统指定位置2.1创建目录2.2下载MySQL压缩包 3、安装MySQL3.1创建目录3.2解压mysql压缩包3.3安装解…

用Python代码锁定Excel单元格以及行和列

Excel能够帮助用户高效地组织数据&#xff0c;还支持复杂的公式计算和数据分析。而随着团队协作的日益频繁&#xff0c;保护数据的准确性和完整性变得尤为重要。在Excel表格中&#xff0c;我们可以通过锁定特定的单元格或区域&#xff0c;防止对单元格内容进行随意修改&#xf…

2024年全国大学生数据统计与分析竞赛B题论文和代码:电信银行卡诈骗检测数据分析和机器学习模型构建

2024年全国大学生数据统计与分析竞赛B题论文和代码已完成&#xff0c;代码为B题全部问题的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求解&#x…

人工智能--Foxmail邮箱使用方法

目录 &#x1f349;Foxmail全面指南 &#x1f349;下载与安装 &#x1f348;下载软件 &#x1f348;安装软件 &#x1f349;配置邮箱 &#x1f348;启动 Foxmail &#x1f348;添加邮箱账户 &#x1f348;手动配置邮箱 &#x1f34d;接收邮件服务器 (IMAP/POP3) &…

亘古真知

目录 一&#xff0c;概述 二&#xff0c;个人面板 三&#xff0c;科技面板 四&#xff0c;手牌 五&#xff0c;回合 1&#xff0c;行动 &#xff08;1&#xff09;打造 &#xff08;2&#xff09;学习 &#xff08;3&#xff09;归档 &#xff08;4&#xff09;挖掘 …

麒麟操作系统运维工程师(KYCP)课程,实现职业突破

在IT行业中&#xff0c;掌握先进的技能和知识是实现职业突破的关键。如果你希望在麒麟操作系统上成为一名卓越的运维工程师&#xff0c;那么麒麟操作系统运维工程师&#xff08;KYCP&#xff09;课程将是你的理想全面提升学员在麒麟操作系统环境下的运维能力。课程内容涵盖安全…

如何提高网站访问量?

提高网站访问量通常需要一个多方面的策略&#xff0c;涉及SEO、内容营销、社交媒体和其他网络营销手段&#xff0c;而我们仅从seo入手来说说 关键词优化是SEO的核心&#xff0c;它确保网站能够针对潜在用户的搜索查询进行优化。这不仅涉及在网站内容中使用正确的关键词 还需要…

Lua移植到标准ANSI C环境

本文目录 1、引言2、环境准备2.1 源码下载2.2 项目构建环境准备 3、项目编译3.1 添加main.c3.2 Kconfig选择模块3.3 项目构建3.4 项目编译 4、运行 文章对应视频教程&#xff1a; 在下方喔 ~~~ 欢迎关注 点击图片或链接访问我的B站主页~~~ lau解释器移植与功能验证 1、引言 本…

探索LLM 在金融领域有哪些潜在应用——通过使用 GPT-4 测试金融工程、市场预测和风险管理等 11 项任务

概述 近年来&#xff0c;用于自然语言理解和生成的人工智能技术在自然语言处理领域取得了突破性进展&#xff0c;OpenAI 的 GPT 和其他大规模语言模型在该领域取得了显著进步。这些模型通过先进的计算能力和算法&#xff0c;展示了处理复杂任务的能力&#xff0c;如理解复杂语…

安装vs2022低版本

https://learn.microsoft.com/en-us/visualstudio/releases/2022/release-history#updating-your-installation-to-a-specific-release 参考https://www.cnblogs.com/bodong/p/18084619

Sketch文件轻松转换为PSD的简便方法

由于Sketch只支持在Mac上使用&#xff0c;当设计师使用Sketch完成设计草案&#xff0c;需要与使用Windows的同事连接设计项目时&#xff0c;会遇到同事无法打开或在Photoshop中查看和编辑的情况&#xff0c;这真的很尴尬。别担心&#xff01;在本文中&#xff0c;我们将分享Ske…

计算机网络--物理层

计算机网络--计算机网络概念 计算机网络--物理层 计算机网络--数据链路层 计算机网络--网络层 计算机网络--传输层 计算机网络--应用层 1. 基本概念 物理层的概念&#xff1a;物理层解决如何在在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输…

生气时,你的“心”会发生什么变化?孟德尔随机化分析猛如虎,结果都是套路...

“不生气不生气&#xff0c;气出病来无人替”&#xff0c;不少人遇事常这样宽慰自己。事实上&#xff0c;“气死”真不是危言耸听。越来越多的研究证明了情绪稳定对健康的重要性&#xff0c;那么&#xff0c;当情绪频繁波动时&#xff0c;我们的心血管究竟会发生什么变化&#…