二叉查找树

最近在看数据结构和算法(c语言描述),想着用c++自己实现一遍


节点类:

#ifndef __NODE_H__
#define __NODE_H__

#include <iostream>

template<typename T> struct Node
{
	T m_val;
	Node<T>* m_pl;
	Node<T>* m_pr;

	Node() : m_pl(nullptr), m_pr(nullptr)
	{
	}
	Node(T value, Node<T>* __pl = nullptr, Node<T>* __pr = nullptr) : m_val(value), m_pl(__pl), m_pr(__pr)
	{
	}
	void printType()
	{
		std::cout << typeid(T).name() << std::endl;
	}
};

#endif



查找树:

#ifndef __SEARCHTREE_H__
#define __SEARCHTREE_H__

#include "node.h"


template<typename T> class SearchTree
{
public:
	SearchTree() : root(nullptr)
	{
	}
	~SearchTree() {}

	//生成一棵空树,好像啥都没做
	void MakeEmpty();

	//查找树中元素
	Node<T>* Find(T value);

	//查找最小元素
	Node<T>* FindMin();

	//查找最大元素
	Node<T>* FindMax();

	Node<T>* Insert(T value);

	void PreTraversal();
	void MidTraversal();
	void BackTraversal();

	void Destroy();

	void Delete(T value);

private:
	Node<T>* root;

	Node<T>* MakeEmpty(Node<T>* pnd);

	Node<T>* Find(Node<T>* pnd, T value);

	Node<T>* FindMin(Node<T>* pnd);

	Node<T>* Insert(Node<T>*& pnd, T value);

	void PreTraversal(Node<T>* pnd);
	void MidTraversal(Node<T>* pnd);
	void BackTraversal(Node<T>* pnd);

	void Destroy(Node<T>* pnd);

	void Delete(Node<T>*& pnd, T value);

	T DeleteMin(Node<T>*& pnd);

};

template<typename T> Node<T>* SearchTree<T>::MakeEmpty(Node<T>* pnd)
{
	if (pnd != nullptr)
	{
		MakeEmpty(pnd->m_pl);
		MakeEmpty(pnd->m_pr);
		delete pnd;
	}
	return nullptr;
}

template<typename T> void SearchTree<T>::MakeEmpty()
{
	if (root != nullptr)
	{
		MakeEmpty(root);
	}
	root = nullptr;
}




template<typename T> Node<T>* SearchTree<T>::Find(Node<T>* pnd, T value)
{
	if (pnd == nullptr)
		return nullptr;
	if (value < pnd->m_val)
	{
		return Find(pnd->m_pl, value);
	}
	else if (value > pnd->m_val)
	{
		return Find(pnd->m_pr, value);
	}
	else
		return pnd;
}

template<typename T> Node<T>* SearchTree<T>::Find(T value)
{
	return Find(root, value);
}



template<typename T> Node<T>* SearchTree<T>::FindMin(Node<T>* pnd)
{
	if (pnd == nullptr)
		return nullptr;
	else if (pnd->m_pl == nullptr)
		return pnd;
	else
		return FindMin(pnd->m_pl);
}

template<typename T> Node<T>* SearchTree<T>::FindMin()
{
	if (root == nullptr)
		return nullptr;

	return FindMin(root);
}


template<typename T> Node<T>* SearchTree<T>::FindMax()
{
	if (root == nullptr)
		return nullptr;
	Node<T>* tmp = root;
	while (tmp->m_pr != nullptr)
	{
		tmp = tmp->m_pr;
	}
	return tmp;
}


//插入的递归写法(此版本不允许插入两个相同的值)
//template<typename T> Node<T>* SearchTree<T>::Insert(Node<T>*& pnd, T value)
//{
//	if (pnd == nullptr)
//	{
//		pnd = new Node<T>(value);
//	}
//	else if (value < pnd->m_val)
//	{
//		return Insert(pnd->m_pl, value);
//	}
//	else if (value > pnd->m_val)
//	{
//		return Insert(pnd->m_pr, value);
//	}
//	/*这样插入是不支持插入两个相同的值的*/
//	return pnd;
//}
//
//template<typename T> Node<T>* SearchTree<T>::Insert(T value)
//{
//	return Insert(root, value);
//}


//插入的非递归写法(此版本不允许插入两个相同的值)
template<typename T> Node<T>* SearchTree<T>::Insert(T value)
{
	if (root == nullptr)
	{
		root = new Node<T>(value);
		return root;
	}
	Node<T>* pre = nullptr;
	Node<T>* tmp = root;
	while (tmp != nullptr)
	{
		pre = tmp;
		if (value < tmp->m_val)
		{
			tmp = tmp->m_pl;
		}
		else if (value > tmp->m_val)
		{
			tmp = tmp->m_pr;
		}
	}

	if (value < pre->m_val)
	{
		pre->m_pl = new Node<T>(value);
		return pre->m_pl;
	}
	if (value > pre->m_val)
	{
		pre->m_pr = new Node<T>(value);
		return pre->m_pr;
	}
	return nullptr;
}


template<typename T> void SearchTree<T>::PreTraversal(Node<T>* pnd)
{
	if (pnd == nullptr)
		return;
	std::cout << pnd->m_val << std::endl;
	PreTraversal(pnd->m_pl);
	PreTraversal(pnd->m_pr);
}

template<typename T> void SearchTree<T>::PreTraversal()
{
	PreTraversal(root);
}

template<typename T> void SearchTree<T>::MidTraversal(Node<T>* pnd)
{
	if (pnd == nullptr)
		return;
	MidTraversal(pnd->m_pl);
	std::cout << pnd->m_val << std::endl;
	MidTraversal(pnd->m_pr);
}

template<typename T> void SearchTree<T>::MidTraversal()
{
	MidTraversal(root);
}

template<typename T> void SearchTree<T>::BackTraversal(Node<T>* pnd)
{
	if (pnd == nullptr)
		return;
	BackTraversal(pnd->m_pl);
	BackTraversal(pnd->m_pr);
	std::cout << pnd->m_val << std::endl;
}

template<typename T> void SearchTree<T>::BackTraversal()
{
	BackTraversal(root);
}


template<typename T> void SearchTree<T>::Destroy(Node<T>* pnd)
{
	if (pnd == nullptr)
		return;
	Destroy(pnd->m_pl);
	Destroy(pnd->m_pr);
	delete pnd;
}

template<typename T> void SearchTree<T>::Destroy()
{
	Destroy(root);
	root = nullptr;
}


template<typename T> void SearchTree<T>::Delete(Node<T>*& pnd, T value)  //这里又犯了这个错误,因为下面要改变指向,所以肯定要传引用
{
	if (pnd == nullptr)
		return;
	if (value < pnd->m_val)
	{
		Delete(pnd->m_pl, value);
	}
	else if (value > pnd->m_val)
	{
		Delete(pnd->m_pr, value);
	}
	else if (pnd->m_pl != nullptr && pnd->m_pr != nullptr) //如果有左子树和右子树,那么为了保持查找树特性,要找出右子树中的最小值
	{
		/*Node<T> *tmp = FindMin(pnd->m_pr); 
		pnd->ch = tmp->ch;
		Delete(pnd->m_pr, tmp->ch);*/

		pnd->m_val = DeleteMin(pnd->m_pr);   //其实应该像书里所说的,实现一个DeleteMin,就可以不用像现在这样搜索两次,提高效率
	}
	else  //只有左子树或只有右子树
	{
		Node<T> *tmp = pnd;
		if (pnd->m_pl == nullptr)
		{
			pnd = pnd->m_pr;
		}
		else if (pnd->m_pr == nullptr)
		{
			pnd = pnd->m_pl;
		}
		delete tmp;
	}
}


template<typename T> void SearchTree<T>::Delete(T value)
{
	Delete(root, value);
}



//DeletMin专用于在删除节点时如果此节点有左右子节点的情况,为了保持二叉查找树的特性,要找出右子树中的最小节点替换当前节点,并将其删除
//注意是引用,所以写法是对的,实际操作的是父节点的左指针或者右指针,上面好几个函数都是以指针引用的形式直接改变父节点左右指针的指向
template<typename T> T SearchTree<T>::DeleteMin(Node<T>*& pnd) 
{
	//这里其实应该保证传入的pnd必须不为空,好在Delete函数中就保证了
	T value;
	memset(&value, 0, sizeof(value));
	if (pnd == nullptr)
		return value;
	//是最小的
	if (pnd->m_pl == nullptr)
	{
		Node<T>* tmp = pnd;
		value = pnd->m_val;
		//if (pnd->m_pr != nullptr)
		pnd = pnd->m_pr; //不管怎么样,都等于右节点,m_pr是nullptr也是正确的

		delete tmp;
		tmp = nullptr;
		return value;
	}
	else
		return DeleteMin(pnd->m_pl);
}


#endif




main函数:

int main(int argc, char* argv[])
{
	//TestCreateTree();
	/*Node<int> no;
	no.printType();*/

	SearchTree<int> st;
	st.MakeEmpty();

	Node<int> *p = st.Insert(10);
	p = st.Insert(20);
	st.Insert(30);
	st.Insert(5);
	st.Insert(8);
	st.MidTraversal();

	st.Delete(30);

	cout << "******************************" << endl;

	st.MidTraversal();

	st.Destroy();
	

	system("pause");
}


内容概要:本文针对考虑算力负荷时空迁移特性的多微电网与共享储能系统的协同优化调度问题展开研究,并提供了完整的Matlab代码实现。研究构建了融合算力负荷动态迁移特征的数学优化模型,通过引入共享储能机制,实现多微电网间的能量互济与资源协同,有效提升系统对分布式能源波动性和负荷不确定性的适应能力。文中采用先进的优化算法求解该调度模型,重点解决了算力任务在时空维度上的灵活调配与电力供需平衡之间的耦合关系,旨在提高综合能源系统的运行经济性、可靠性与灵活性。所提出的方法为未来能源互联网背景下电-算协同管理提供了理论支持与技术路径。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力的科研人员、高校研究生,尤其适用于从事微电网运行、共享储能配置、综合能源系统优化以及电-算融合等领域研究的专业技术人员。; 使用场景及目标:①开展多微电网与共享储能系统的协同调度策略设计与仿真验证;②支撑高比例可再生能源接入下的新型电力系统优化运行研究;③为考虑算力迁移的数据中心与电网协同调度提供建模与算法参考;④作为高水平学术论文撰写或学位课题研究的技术支撑与代码复现平台。; 阅读建议:建议读者结合Matlab代码与相关学术文献深入研读,重点关注目标函数构建、约束条件设定及求解器调用逻辑,可在现有模型基础上拓展多时间尺度优化、不确定性建模(如鲁棒优化、随机规划)或加入实际工程约束进行二次开发与深化研究。
内容概要:本文围绕“双层优化”方法在电动汽车有序充电中的应用展开研究,重点探讨了如何通过Matlab代码实现面向智能电网背景下的电动汽车充电优化调度。文中提出了一种双层优化模型,上层以系统运行成本最小化为目标进行全局优化,下层则综合考虑用户充电需求、行为特性及响应意愿,实现有序充电策略的局部优化。该模型充分结合实际电力系统约束条件,如配电网容量限制、分时电价机制以及可再生能源出力波动等,有效提升了充电管理的经济性、稳定性和可实施性。研究还提供了完整的Matlab代码实现方案,并配套YALMIP、CPLEX等工具的调用示例,便于读者复现算法与仿真流程。此外,文档列举了多个相关科研方向与仿真资源,涵盖微电网优化、智能算法调度、电动汽车与储能协同控制等领域,并附有网盘资料下载链接,支持进一步拓展研究。; 适合人群:具备一定电力系统基础知识和优化算法理解能力,从事新能源、智能电网、电动汽车等领域研究的研究生、高校科研人员及工程技术人员。; 使用场景及目标:①学习并掌握双层优化模型在电动汽车有序充电场景中的建模思路与求解方法;②利用Matlab实现电力系统中复杂的多目标、多层次优化调度问题;③复现高水平期刊论文中的优化策略,支撑科研项目申报、学术论文撰写或学位课题研究。; 阅读建议:建议结合所提供的Matlab代码与建模框架进行动手实践,重点关注双层架构的数学建模过程与上下层交互机制,熟练掌握YALMIP建模语言和CPLEX求解器的使用技巧,同时参考文档中推荐的相关研究方向开展横向对比与创新延伸。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值