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

【问题描述】

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

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

【输入输出】

【输入形式】

第一行输入数字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.mfbz.cn/a/691748.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

车载诊断架构 - 引导诊断

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

八爪鱼现金流-018,持续打磨

八爪鱼,被动收入,财务自由,现金流,现金流游戏,各银行利率,money,资产负债表,财务自由,资产管理,个人理财,管理个人资产,理财,打造被动收入,躺着赚钱,让钱为我打工

Cell-在十字花科植物中年生和多次开花多年生开花行为的互相转化-文献精读21

Reciprocal conversion between annual and polycarpic perennial flowering behavior in the Brassicaceae 在十字花科植物中年生和多次开花多年生开花行为的互相转化 亮点 喜马拉雅须弥芥 和 内华达糖芥 是两个多年生植物模型 MADS-box 基因的剂量效应决定了一年生、二年生…

使用OpenCV dnn c++加载YOLOv8生成的onnx文件进行实例分割

在网上下载了60多幅包含西瓜和冬瓜的图像组成melon数据集&#xff0c;使用 EISeg 工具进行标注&#xff0c;然后使用 eiseg2yolov8 脚本将.json文件转换成YOLOv8支持的.txt文件&#xff0c;并自动生成YOLOv8支持的目录结构&#xff0c;包括melon.yaml文件&#xff0c;其内容如下…

【Python教程】1-注释、变量、标识符与基本操作

在整理自己的笔记的时候发现了当年学习python时候整理的笔记&#xff0c;稍微整理一下&#xff0c;分享出来&#xff0c;方便记录和查看吧。个人觉得如果想简单了解一名语言或者技术&#xff0c;最简单的方式就是通过菜鸟教程去学习一下。今后会从python开始重新更新&#xff0…

人工智能--教育领域的运用

文章目录 &#x1f40b;引言 &#x1f40b;个性化学习 &#x1f988;体现&#xff1a; &#x1f988;技术解析&#xff1a; &#x1f40b;智能辅导与虚拟助手 &#x1f988;体现&#xff1a; &#x1f988;技术解析&#xff1a; &#x1f40b;自动评分与评估 &#x1f…

AI大模型在广告领域的应用

深度对谈&#xff1a;广告创意领域中AIGC的应用_生成式 AI_Tina_InfoQ精选文章

【python】OpenCV GUI——Mouse(14.1)

参考学习来自 文章目录 背景知识cv2.setMouseCallback 介绍小试牛刀 背景知识 GUI&#xff08;Graphical User Interface&#xff0c;图形用户界面&#xff09; 是一种允许用户通过图形元素&#xff08;如窗口、图标、菜单和按钮&#xff09;与电子设备进行交互的界面。与传统…

【Mtk Camera开发学习】06 MTK 和 Qcom 平台支持通过 Camera 标准API 打开 USBCamera

本专栏内容针对 “知识星球”成员免费&#xff0c;欢迎关注公众号&#xff1a;小驰行动派&#xff0c;加入知识星球。 #MTK Camera开发学习系列 #小驰私房菜 Google 官方介绍文档&#xff1a; https://source.android.google.cn/docs/core/camera/external-usb-cameras?hlzh-…

【React】classnames 优化类名控制

1. 介绍 classnames是一个简单的JS库&#xff0c;可以非常方便的通过条件动态的控制class类名的显示 ClassNames是一个用于有条件处理classname字符串连接的库 简单来说就是动态地去操作类名&#xff0c;把符合条件的类名粘在一起 现在的问题&#xff1a;字符串的拼接方式不…

VMware导入小白分享的MacOS版本之后,无法开机的解决方案

前言 这段时间陆续有小伙伴找到小白&#xff0c;说&#xff1a;导入小白分享的MacOS版本之后&#xff0c;出现无法开机的问题。 遇到这个问题&#xff0c;并不是说明分享版本有问题&#xff0c;因为大部分小伙伴导入之后都没有出现类似的问题&#xff0c;都是导入之后开机&…

记录项目使用ts时引入js文件后导致项目运行空白问题

主要原因&#xff1a; 使用ts后开启了eslint检测&#xff0c;而js压缩文件引入的位置在eslint检测的文件内。导致eslint检测认为该文件为很大的文件&#xff0c;或eslint认为此文件内存在无法处理的语法结构等问题。 解决方法&#xff1a; 1、把文件移到eslint检测外的文件引入…

居家实用类词汇,柯桥俄语培训

Посудомоечная машина 洗碗机 Холодильник 冰箱 Микроволновая печь 微波炉 Мультиварка 多功能电饭煲 Электронные весы для продуктов 食品电子秤 Электрическая мяс…

前端开发之中svg图标的使用和实例

svg图标的使用和实例 前言效果图1、安装插件2、vue3中使用2.1、 在components文件夹中,创建公共类SvgIcon/index.vue2.2、创建icons文件,存放svg图标和将所有的svg图标进行引用并注册成全局组件2.3、在man.js 中注册2.4、在vue.config.js中配置svg2.5、在vue中的调用svg图标3…

【JS实战03】学生信息的添加与删除

说明&#xff1a;本文章提供相应源码&#xff0c;需要到主页资源栏下载&#xff0c;并搭配源码看本文档&#xff1b;重点阐述每个JS模块实现过程中的重难点问题。 一&#xff1a;录入模块 1 渲染数据思路 减少DOM相关操作&#xff0c;避免因过多的DOM操作造成程序运行速度的…

计网总结☞物理层

五层协议体系结构->各层的功能有&#xff1a; 物理层 物理层的任务就是尽可能地屏蔽传输媒体的差异&#xff0c;透明地传送比特流&#xff08;注意&#xff1a;传递信息的物理媒体&#xff0c;如双绞线、同轴电缆、光缆等&#xff0c;是在物理层的下面&#xff0c;当做第 0…

【Vue】声明式导航-自定义类名(了解)

问题 router-link的两个高亮类名 太长了&#xff0c;我们希望能定制怎么办 解决方案 我们可以在创建路由对象时&#xff0c;额外配置两个配置项即可。 linkActiveClass和linkExactActiveClass const router new VueRouter({routes: [...],linkActiveClass: "类名1&quo…

WinForms 应用(.NET 8.0)使用ReportViewerCore.WinForms显示打印RDLC报表

在要WinForms 应用&#xff08;.NET 8.0&#xff09;中&#xff0c;显示RDLC报表&#xff0c;就要使用ReportViewerCore.WinForms。原来的ReportViewer只能在.NET Framework框架下运行。 1.ReportViewerCore.WinForms 程序包说明 SQL Server Reporting Services ReportViewer…

万字长文|OpenAI模型规范(全文)

本文是继《OpenAI模型规范概览》之后对OpenAI Model Spec的详细描述&#xff0c;希望能对各位从事大模型及RLHF研究的朋友有帮助。万字长文&#xff0c;建议收藏后阅读。 一、概述 在AI的世界里&#xff0c;确保技术的行为符合我们的期望至关重要。OpenAI最近发布了一份名为Mo…

Linux(Rocky)下 如何输入中文(切换中文输入法)教程

RockyLinux如何输入中文&#xff08;切换中文输入法&#xff09; 注意 在字符画界面的Linux系统中 默认不具备中文输入法的功能 需要SSH或其他远程工具来实现 问题 可能大家有的时候安装了一个虚拟机之后 想切换中文输入法 但是一直找不到方法 下面将利用Rocky9.2作为演示…