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

news2024/11/29 10:46:46

【问题描述】

编写程序在不增加结点的情况下,将二叉排序树转换成有序双向链表(如下图)。

链表创建结束后,按照从前往后的顺序输出链表中结点的内容。

【输入输出】

【输入形式】

第一行输入数字n,第二行输入n个整数。

【输出形式】

按照从后往前的顺序输出链表中的结点内容。

【样例输入】

6 63 55 90 58 98 70

【样例输出】

Convert binary sort tree into linked list...

55 58 63 70 90 98

【代码】

多加了个逆序输出链表内容……

#include<iostream>
using namespace std;
const int MAX = 1000;
struct BiNode {
	int data;
	BiNode* lchild, * rchild;
};

class BiSortTree {
private:
	BiNode* root;  //指向根结点的头指针
	BiNode* rear;  //指向尾结点的指针
	//BiNode  *pre;   //---指向当前访问的结点的前序节点
public:
	BiSortTree(int array[], int arrayLength);  //构造函数,建立一棵二叉树
	~BiSortTree();          //---
	void convertBiToLink(); //---二叉排序树转换成双向链表
	void DisplayLink();     //---显示双向链表
	void ReverseDisplayLink(); //---逆序显示
	void release(BiNode* bt);
private:
	void insertBST(BiNode*& bt, BiNode *key);
	void convert(BiNode* bt); //---二叉排序树转换成双向链表的递归程序
};
BiSortTree::BiSortTree(int array[], int arrayLength)
{
	root = NULL;  
	for (int i = 0; i < arrayLength; i++)
	{
		BiNode* p = new BiNode;
		p->lchild = p->rchild = NULL;
		p->data = array[i];
		insertBST(root, p);
	}
}
BiSortTree::~BiSortTree()
{
	release(root);
}
void BiSortTree::release(BiNode* bt)
{
	if (bt != NULL)
	{
		release(bt->lchild);
		release(bt->rchild);
		delete bt;
		bt = NULL;
	}
}
// 插入节点
void BiSortTree::insertBST(BiNode*& bt, BiNode *key)
{
	if (bt == NULL)
	{
		bt = new BiNode;
		bt->data = key->data;
		bt->lchild = NULL;
		bt->rchild = NULL;
	}
	else
	{
		if (key->data < bt->data)
			insertBST(bt->lchild, key);
		else if (key->data > bt->data)
			insertBST(bt->rchild, key);
	}
}

/*二叉排序树转换成双向链表

二叉排序树的递归定义是:
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
它的左、右子树也分别为二叉排序树;

实现思路:
1.二叉排序树的特点就是一个结点的左子树比它小,右子树比它大,所以可以根据中序遍历得到一棵排序的序列。
2.由于不能创建新结点,那么我们只能去修改原始二叉树的指针。
  这里我们让指向左子树的指针变为链表中指向前序结点的指针,而指向右子树的指针变为链表中指向后一个结点的指针。

*/
void BiSortTree::convertBiToLink()
{
	if (root == NULL)
		return;
	else
	{
		convert(root);
		//将root指向链表的头部
		while (root->lchild) //root从当前位置出发,向其左孩子移动,直到左孩子为空,到达头部
		{
			root = root->lchild;
		}
	}
}
//二叉树转换成双向链表,采用中序遍历,当访问根节点的时候实现转换
void BiSortTree::convert(BiNode* bt)
{
	static BiNode* pre = NULL;  //指向当前访问节点的前序结点
	if (bt == NULL)
	{
		return;
	}
	else
	{
		convert(bt->lchild);  //访问左子树
		//访问根节点
		if (pre == NULL) // 如果是链表的第一个节点
		{
			root = bt; // 设置链表的头部
		}
		else
		{
			pre->rchild = bt; // 将前一个节点的右指针指向当前节点
			bt->lchild = pre; // 将当前节点的左指针指向前一个节点
		}
		pre = bt;           // 当前根节点变成前序结点
		convert(bt->rchild);  // 访问右子树
	}
}
//正序输出二叉排序树链表
void BiSortTree::DisplayLink()
{
	BiNode* p;
	p = root;
	while (p)
	{
		cout << p->data << " ";
		p = p->rchild;
	}
	cout << endl;
}
//逆序输出二叉排序树链表
void BiSortTree::ReverseDisplayLink()
{
	if (root == NULL) 
		return; // 如果链表为空,直接返回
	BiNode* p = root;
	// 找到链表的最后一个节点
	while (p->rchild)
	{
		p = p->rchild;
	}
	// 逆序输出
	while (p)
	{
		cout << p->data << " ";
		BiNode* temp = p->lchild;
		delete p; // 释放节点以避免内存泄漏
		p = temp;
	}
	root = NULL; // 清空链表头部指针
	rear = NULL; // 清空链表尾部指针
}
int main()
{
	int n;
	cin >> n;
	int array[MAX] = { 0 };
	for (int i = 0; i < n; i++)
	{
		cin >> array[i];
	}
	cout << "Convert binary sort tree into linked list..." << endl;
	BiSortTree BSTLink(array, n);
	BSTLink.convertBiToLink();
	BSTLink.DisplayLink();

	cout << "Reverse display link...\n";
	BSTLink.ReverseDisplayLink();
	return 0;
}

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

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

相关文章

【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;我们的心血管究竟会发生什么变化&#…

老师如何制作高考后志愿填报信息采集系统?

高考结束后&#xff0c;志愿填报成为学生们的头等大事。面对众多选择&#xff0c;如何高效、准确地填报志愿&#xff0c;是每个学生和家长都关心的问题。作为老师&#xff0c;能否利用现有的技术工具&#xff0c;帮助学生更好地完成志愿填报呢&#xff1f; 老师们需要一个能够…

群体优化算法---灰狼优化算法学习介绍以及在卷积神经网络训练上的应用

**长文预警**介绍 在自然界中&#xff0c;狼群的社会结构和捕猎策略展现了高度的智能和协调性&#xff0c;灰狼优化算法&#xff08;Grey Wolf Optimizer, GWO&#xff09;正是受此启发提出的一种群体智能优化算法。GWO主要模拟了灰狼的社会等级制度和捕猎行为&#xff0c;其核…

MySQL数据库(详解)

目录 前言 一、数据库的基本概念 1.数据(Data) 2.表 3.数据库 4.数据库管理系统(DBMS) 5.数据库系统 二、数据库系统发展史 1.第一代数据库 2.第二代数据库 3.第三代数据库 三、当今主流数据库介绍 1.SQL Server (微软公司产品) 2.Oracle (甲骨文公司产品) 3.DB…

[office] 如何在Excel中拉动单元格时表头不变形- #学习方法#职场发展#经验分享

如何在Excel中拉动单元格时表头不变形? 如何在Excel中拉动单元格时表头不变形&#xff1f;Excel是我们常用的办公软件&#xff0c;当我们使用Excel拉动单元格时表头不变形&#xff0c;该如何操作呢&#xff0c;下面小编就为大家做详细讲解 如何在Excel中拉动单元格时表头不变…

[word] 在Word中插入分页符 #经验分享#经验分享#笔记

在Word中插入分页符 在 Word中插入分页符&#xff1f;教大家如何在正文中快速的插入分页符。 ? ? ?1、在正文中选择我们要分页的位置。 ? ? ?2、点击插入&#xff0c;选择分页功能里面的“分页符”功能&#xff0c;即可成功在我们选择的位置进行分页。 ? ? ? ?以上…

存在d盘里的数据突然没有了?别担心,恢复方案在此

在数字化时代&#xff0c;数据存储的重要性不言而喻。然而&#xff0c;有时候我们会遭遇一些意想不到的困扰&#xff0c;比如存储在D盘的数据突然消失。这不仅可能导致重要文件的丢失&#xff0c;还可能影响我们的工作和生活。本文将探讨D盘数据消失的可能原因&#xff0c;提供…