二叉搜索树转换成一个排序的双向链表和实现一个线程安全且高效单例类——题集(二十一)

二叉搜索树与双向链表(Java) 题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向,比如输入下图中左边的二叉搜索树,则输出转换之后的排序双向链表。struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }思路1:在二叉树中,每个结点都有两... 阅读详情

二叉搜索树转换成一个排序的双向链表和实现一个线程安全且高效单例类——题集(二十一)

       今天分享一下实现二叉搜索树转换成一个排序的双向链表和用C++实现一个线程安全且高效单例类的源代码和运行示例。

      将二叉搜索树转换成一个排序的双向链表的源代码和运行示例。

       提示:要求不能创建任何新的结点,只能调整树中结点指针的指向,也就是left当prev,right当next。--中序线索化的变型。

源代码如下:

#include<iostream>
using namespace std;
#include<stack>

TreeNode* SortList(TreeNode* root){//二叉搜索树转换成一个排序的双向链表
	if(root==NULL) return root;
	stack<TreeNode*> tmp;
	TreeNode* head=NULL;
	TreeNode* cur=root;
	TreeNode* prev=NULL;

	while(cur || !tmp.empty()){
		while(cur){
			tmp.push(cur);
			cur=cur->left;
		}

		cur=tmp.top();
		tmp.pop();
		if(head==NULL){
			head=cur;
		}
		else{
			prev->right=cur;
		}
			cur->left=prev;
			prev=cur;
			cur=cur->right;
	}
	
	return head;
}

void TestTree29(){//搜索二叉树转换成一个排序的双向链表
	TreeNode * root0=new TreeNode(8);
	TreeNode * root1=new TreeNode(5);
	TreeNode * root2=new TreeNode(14);
	TreeNode * root3=new TreeNode(2);
	TreeNode * root4=new TreeNode(6);
	TreeNode * root5=new TreeNode(18);

	root0->left = root1;
	root0->right = root2;
	root1->left = root3;
	root1->right = root4;
	root2->right = root5;

	TreeNode* head=SortList(root0);//二叉搜索树转换成一个排序的双向链表
	cout<<"二叉搜索树转换成一个排序的双向链表"<<endl;

	TreeNode* prev=NULL;
	cout<<"正序打印: ";//->next/right
	while(head!=NULL){
		cout<<head->val<<" ";
		prev=head;
		head=head->right;
	}
	cout<<endl;

	cout<<"逆序打印: ";//->prev/left
	while(prev!=NULL){
		cout<<prev->val<<" ";
		head=prev;
		prev=prev->left;
	}
	cout<<endl;
}

int main(){
	TestTree29();//搜索二叉树转换成一个排序的双向链表
	
	system("pause");
	return 0;
}

运行结果:

 

      C++实现一个线程安全且高效单例类的源代码和运行示例。

      单例模式:单例类保证全局只有一个唯一实例对象。且单例类提供获得该唯一实例的接口。

      懒汉模式

优点:第一次调用才初始化,加载类时比较快,且避免内存浪费。

缺点:但是在运行时获取对象的速度比较慢,线程不安全,可利用双重检查加锁来提高效率,保证线程安全。

       饿汉模式

优点:简洁,不用加锁,效率高,且线程安全。获取对象的速度比较快。 

缺点:类加载时就初始化,所以加载类时比较慢,且浪费内存。

源代码如下:

#include<iostream>
using namespace std;
#include <thread>        
#include <mutex>        
#include <stdexcept> 

//实现一个线程安全的单例模式
//懒汉模式-加互斥锁
class LazyModel{
public:
	//得到对象
	static LazyModel* GetObject(){
		if(_object==NULL){//双重判断加锁机制
			std::lock_guard<std::mutex> lck(_mutx);
			if(_object==NULL){
				LazyModel* tmp=new LazyModel();
				_object=tmp;
			}
		}
		return _object;
	}
	//删除对象
	static void DelObject(){
		std::lock_guard<std::mutex> lck(_mutx);
		if(_object){
			delete _object;
			_object=NULL;
		}
	}

	//打印对象
	void Print(){
		cout<<_data<<endl;
	}
private:
	//构造
	LazyModel()
		:_data(1)
	{}

	LazyModel(const LazyModel&);
	LazyModel& operator=(const LazyModel&);

	//析构
	~LazyModel(){}


	static LazyModel* _object;
	static mutex _mutx;
	int _data;
};
LazyModel* LazyModel::_object=NULL;
mutex LazyModel::_mutx;

void TestLazyModel(){//懒汉模式
	cout<<"懒汉模式"<<endl;
	LazyModel::GetObject()->Print();
	LazyModel::DelObject();
	cout<<endl;
}

//饿汉模式
class HungerModel{
public:
	//得到对象
	static HungerModel* GetObject(){
		static HungerModel sigle;//静态全局对象
		return &sigle;
	}
	
//打印对象
	void Print(){
		cout<<_data<<endl;
	}
private:
	//构造
	HungerModel()
		:_data(2)
	{}

	HungerModel(const HungerModel&);
	HungerModel& operator=(const HungerModel&);

	//析构
	~HungerModel(){}


	int _data;
};

void TestHungerModel(){//饿汉模式
	cout<<"饿汉模式"<<endl;
	HungerModel::GetObject()->Print();
	cout<<endl;
}

int main(){
		TestLazyModel();//懒汉模式
	TestHungerModel();//饿汉模式
	
	system("pause");
	return 0;
}

运行结果:

 

      感觉很难呢,写的有点挫,如果有错误,请一定要指出来。

      分享如上,如有错误,望斧正!愿大家学得开心,共同进步!

线程安全型双向链表的实现 操作系统c++编程实现安全型双向链表,线程的创建,利用线程对链表进行增删改操作,并检验结果是否正确 立即下载

相关推荐

C++双向链表类及四种多线程安全读写测试用例

实现双向链表,查找、替换、删除、插入,并用线程同步技术实现了多线程读写与线程安全

Java并发体系--LinkedBlockingDeque

LinkedBlockingDeque是一个线程安全的双端队列,它是基于链表的数据结构实现的。它继承自AbstractQueue类并实现了BlockingDeque接口。它可以在队列的两端进行元素的插入和删除操作。LinkedBlockingDeque可以选择有限容量或无限容量。如果指定了容量,那么在插入元素时,如果队列已满,插入操作将会阻塞,直到有空间可用。如果没有指定容量,那么队列的容量将是无限的。LinkedBlockingDeque以链表的形式存储元素,这样可以实现高效的插入和删除操作。

Flying_Fish_roe的博客 1368

线程安全双向链表源代码

线程安全双向链表实现2次检验,中间包含3个线程,代码完善。可以vs与vc++运行,没有问题

实现一个线程安全的双向链表(C++)

最近实现了一个线程安全的双向链表,使用的是C++类的模式写的,和以前学习数据结构使用struct结构体实现的方式不同,对函数进行了封装,以及使用了C++中的类模板,还有unique_lock锁,对内存泄漏也进行了优化。以下是代码:(注意:请勿在业务代码中使用,代码未经过完全的测试)

761899457@qq.com 2191

多线程实现双向链表增删改

多线程实现双向链表的增删改 其中的信号量设成一个也行- -

操作系统课设-线程安全的双链表

操作系统课设,可运行,线程安全,可用来学习操作系统线程相关知识。

使用线程安全型双向链表实现简单 LRU Cache 模拟

使用线程安全型双向链表实现简单 LRU Cache 模拟目录????博主介绍前言1、动机1.1、要解决的问题2、系统设计2.1、系统总体框架2.2、系统功能模块2.3 系统整体流程3、数据结构设计4、关键技术与系统实现4.1、生成访问序列4.2 各进程的推进4.3、修改链表结构的相关方法实现4.4、访问链表的相关方法实现4.5、应用封装层的实现4.6、统计缓冲区命中率5、系统运行结果5.1、运行环境5.2、运行与测试结果5.2.1、运行结果5.2.2、链表方法测试6、调试与改进????作者相关的文章、资源分

苏州程序大白的博客 1万+

操作系统课设-线程安全的双向链表

原创手操,操作系统课设,线程安全的双向链表,VC6.0,无须配置,可运行

将二叉搜索树转换成一个排序的双向链表

将二叉搜索树转换成一个排序的双向链表 题目:将二叉搜索树转换成一个排序的双向链表。提示:要求不能创建任何新的结点,只能调整树中结点指针的指向,也就是left当prev,right当next。--中序线索化的变型。  在二叉搜索树中,每个结点都有两个指向子节点的指针,在双向链表中,每个结点也有两个指针,分别指向前一个结点和后一个结点。在二叉搜索树中,左子节点的值总是小于右子结点的值,

step_ma的博客 931

Element-UI全面入门与实战技巧

Element-UI 是一套基于 Vue 2.0 的桌面端组件库,由饿了么前端团队开发并维护。它提供了一系列丰富的 UI 组件,旨在帮助开发者快速构建高效、美观的 Vue 应用程序。Element-UI 是一款遵循 Ant Design 设计规范的 Vue UI 库,它涵盖了从按钮、输入框、选择器到表格、标签、进度条等众多常用的界面元素。Element-UI 的组件不仅功能全面,而且易于定制,使得开发者可以快速实现个性化的页面设计。Element-UI 的特点包括:在使用 Element-UI 之前,需要确

全世界的博客 2864

【AI平台】n8n入门2:第一个工作流,调用本地大模型

n8n是一款开源的,专注于AI工作流构建,支持灵活的自定义与集成。就是可以把大模型和其他工具联合起来,这就厉害了。而且,免费功能又强大,目前很火,来研究一下。

正经教主是个热衷于正经学习分享的教主。 4532

牛客网刷题java之输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。

题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 思路: 中序遍历,利用中间变量将彼此指针互相连接。 代码: /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; ...

逆水行舟,不进则退 1698

从零开始搭建属于自己的语音识别API服务器(ASRT开源项目)

材料准备 云服务器 (本人使用的的是阿里云服务器 Ubuntu(Linux操作系统)) 环境搭建 1. Python 3.7 话不多说直接上代码 sudo su yum -y install git yum -y install gcc yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-deve

zhi_qian的博客 5648

Java二叉搜索树转换成一个排序的双向链表

题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。比如输入下图中二叉搜索树,则输出转换后的排序双向链表 在二叉搜索树中,每个结点都有两个分别指向其左、右子树的指针,左子树结点的值总是小于父结点的值,右子树结点的值总是大于父结点的值。在双向链表中,每个结点也有两个指针,它们分别指向前一个结点和后一个结点。所以这两种数据结构的结点是一致,二叉搜索树和双向链表,只是因为两个指针的指向不同而已,通过改变其指针的指向来实现是完全可能的。举个例

luzhensmart的专栏 946

永磁同步电机定子槽型设计实战:从梨形槽到矩形槽的NVH优化之路

本文深入探讨了永磁同步电机定子槽型设计在NVH优化中的关键作用,对比了梨形槽与矩形槽的性能差异。通过Ansys Maxwell仿真和实际案例,揭示了矩形槽在提升槽满率、降低电磁噪声方面的优势,并总结了五大设计黄金法则,为电机设计工程师提供了实用指导。

weixin_28740299的博客 494

中山大学_数据科学与计算机_预推免

前言 2019 年 9 月中旬是中山大学预推免时间,本人没能进到夏令营,但是最后在预推免上岸也算不幸中的万幸。 记忆不一定准确,但希望能帮到他人。 想看 流程 的可以直接看总结,正文部分有本人心路历程。 预推免 中山大学的预推免大致可以分为 报道,机试,面试 三大部分,而且尤其是面试,所有人加起来总时长 3 天,幸运的是,本人被安排在第一天的下午第一场,上午就是机试,报道,机试,面试,无缝衔接。 ...

一把健 5209

二叉搜索树转换成排序双向链表

因为二叉树中,每个结点都有两个指向子节点的指针。在双向链表中也有两个指针,它们分别指向前一个和后一个结点。由于这两种结点的结构相似,同时二叉搜索树也是一种排序的数据结构,因此在理论上可能实现二叉搜索树和排序链表的双向链表的转换。 在搜索二叉树中,左子节点的值总小于父节点的值,右子节点的值总是大于父节点的值(所以使用中序遍历)。因此在转换成排序链表的时候,原先指向左子节点的指针调...

Y~哈哈哈的博客 605

UE4虚拟现实实习总结---蓝图中的常用交互事件|人物行走|物体移动|动态触发|材质改变

这周是ue4实习周,老师给我们的任务就是基于中学物理和化学实验的虚拟实验室,要有交互事件,后期可以链接vr手柄进行操作。 但是实习开始老师影都没了,全靠自己学习。感觉自己学习了不少东西,这里就来总结一下!顺便感叹一下,ue4好玩又强大! 以下主要介绍蓝图中的几种交互事件1.新建游戏角色并且进行角色行走旋转,2.如何控制物体移动旋转,3.如何控制物体材质动态变化 大家可以举一反三,作出更好的作品 1.新建游戏角色并且进行角色行走旋转 步骤 在刚刚新建的文件夹中鼠标右击新建蓝图类,然后分别创建以下:chara

weixin_43902063的博客 6124

可视化图解算法27: 二叉搜索树转双向排序链表

对于二叉树的相关算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。

weixin_42117918的博客 1115

【异常】Hermes Agent调用z.ai接口失败(余额不足)API call failed (attempt 1/3): RateLimitError [HTTP 429]

补充说明:同步尝试解析接口对应网页时,出现“网页解析失败,可能是不支持的网页类型,请检查网页或稍后重试”提示,该提示不影响核心报错排查,仅作为辅助信息。

奶爸的编程之路,也就一周冷个三天 1198

ArcGIS Pro符号化教程

本文详细介绍了ArcGIS Pro的软件设置和符号化操作步骤。主要包括:1)设置默认工程目录和关闭地图自动加载;2)创建新工程的基本流程;3)点要素的单一符号化方法,包括样式修改和图层调整;4)图表符号显示过滤器的使用,涉及字段添加、图表类型选择和背景设置。文章还提供了操作截图和数据下载链接,适合GIS初学者学习ArcGIS Pro的基础符号化操作。

WwLK123的博客 550

java 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 比如将二元查找树                                             10                                           /     \                     

史迪阳的博客 6007

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

二叉搜索树转换成一个排序的双向链表

题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 注解: 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它...

artistkeepmonkey的博客 641

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

将二叉树转换成双向链表

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 因为二叉搜索树每个节点都有两个指针,分别是指向其左子节点和右子节点,所以将该节点的左子节点变成双向链表中的左节点,将该节点的右子节点变成双向链表中的右节点。采用中序列遍历的方法遍历数组,然后利用递归将左边的最后一个节点和根节点相连,将右边的第一个节点和根节点相连。 python代码:...

weixin_42921411的博客 1239

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

二叉搜索树与双向链表

二叉搜索树与双向链表

chenchenchencl的博客 4290
上一篇: 实现循环右移和删除小写字母字符串中重复字符——题集(二十)
下一篇: 模拟实现memcpy和memmove——题集(二十二)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值