栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++二叉搜索树(非递归算法)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++二叉搜索树(非递归算法)

#include 
#include 
#include 
#include 
using namespace std;


template 
class BinarySearchTree
{
public:
	BinarySearchTree()
	{
		root = nullptr;
	}
	BinarySearchTree(const BinarySearchTree& rhs) :root(nullptr)
	{
		root = clone(rhs.root);
	}
	BinarySearchTree(BinarySearchTree&& rhs)
	{
		root = rhs.root;
		rhs.root = nullptr;
	}
	BinarySearchTree& operator = (const BinarySearchTree& rhs)
	{
		BinarySearchTree copy = rhs;
		std::swap(*this, copy);
		return *this;

	}
	BinarySearchTree& operator = (BinarySearchTree&& rhs)
	{
		std::move(root, rhs.root);
		return *this;
	}
	~BinarySearchTree()
	{
		makeEmpty();
	}

	const Comparable& findMin() const
	{
		return findMin(root)->element;
	}
	const Comparable& findMax() const
	{
		return findMax(root)->element;
	}
	bool contains(const Comparable& x) const
	{
		return contains(x, root);
	}
	bool isEmpty() const
	{
		return root == nullptr;
	}
	void printTree(ostream& out = cout) const
	{
		if (root == nullptr)
		{
			out << "Empty tree!" << endl;
			return;
		}
		printTree(root, out);
	}

	void makeEmpty()
	{
		makeEmpty(root);
	}
	void insert(const Comparable& x)
	{
		insert(x, root);
	}
	void insert(Comparable&& x)
	{
		insert(std::move(x), root);
	}

	void remove(const Comparable& x)
	{
		remove(x, root);
	}

private:
	struct BinaryNode
	{
		Comparable element;
		BinaryNode* left;
		BinaryNode* right;
		BinaryNode(const Comparable& theElement, BinaryNode* lt, BinaryNode* rt) :element(theElement), left(lt), right(rt)
		{};
		BinaryNode(Comparable&& theElement, BinaryNode* lt, BinaryNode* rt) :element(std::move(theElement)), left(lt), right(rt)
		{};
	};
	BinaryNode* root;

	void insert(const Comparable& x, BinaryNode*& t)
	{
		if (t == nullptr)
		{
			t = new BinaryNode(x, nullptr, nullptr);
		}
		BinaryNode* p = t;
		while (x < p->element && p->left != nullptr || x > p->element && p->right != nullptr)
		{
			if (x < p->element && p->left != nullptr)
			{
				p = p->left;
			}
			else if (x > p->element && p->right != nullptr)
			{
				p = p->right;
			}
		}
		if (x < p->element)
		{
			p->left = new BinaryNode(x, nullptr, nullptr);
		}
		else if (x > p->element)
		{
			p->right = new BinaryNode(x, nullptr, nullptr);
		}

	}
	void insert(Comparable&& x, BinaryNode*& t)
	{
		if (t == nullptr)
		{
			t = new BinaryNode(std::move(x), nullptr, nullptr);
		}
		BinaryNode* p = t;
		while (x < p->element && p->left != nullptr || x > p->element && p->right != nullptr)
		{
			if (x < p->element && p->left != nullptr)
			{
				p = p->left;
			}
			else if (x > p->element && p->right != nullptr)
			{
				p = p->right;
			}
		}
		if (x < p->element)
		{
			p->left = new BinaryNode(std::move(x), nullptr, nullptr);
		}
		else if (x > p->element)
		{
			p->right = new BinaryNode(std::move(x), nullptr, nullptr);
		}
	}
	void remove(const Comparable& x, BinaryNode*& t)
	{
		if (t == nullptr)
		{
			t = nullptr;
			return;
		}
		BinaryNode* p = t, * pre = nullptr;
		while (p->left != nullptr && x < p->element || p->right != nullptr && x > p->element)
		{
			pre = p;
			if (p->left != nullptr && x < p->element)
			{
				p = p->left;
			}
			if (p->right != nullptr && x > p->element)
			{
				p = p->right;
			}
		}
		if (p->element != x)
		{
			return;
		}
		else if (p->left != nullptr && p->right != nullptr)
		{
			p->element = findMin(p->right)->element;
			remove(p->element, p->right);
		}
		else
		{
			BinaryNode* old = p;
			if (pre != nullptr)
			{
				(p == pre->right ? pre->right : pre->left) = ((p->left != nullptr) ? p->left : p->right);
			}
			else
			{
				t = (p->left == nullptr ? p->right : p->left);
			}
			delete old;
		}
	}
	BinaryNode* findMin(BinaryNode* t) const
	{
		if (t == nullptr)
		{
			return nullptr;
		}
		while (t->left != nullptr)
		{
			t = t->left;
		}
		return t;
	}
	BinaryNode* findMax(BinaryNode* t) const
	{
		if (t == nullptr)
		{
			return nullptr;
		}
		while (t->right != nullptr)
		{
			t = t->right;
		}
		return t;
	}
	bool contains(const Comparable& x, BinaryNode* t) const
	{
		if (t == nullptr)
		{
			return false;
		}
		while (t->left != nullptr && x < t->element || t->right != nullptr && x > t->element)
		{
			if (t->left != nullptr && x < t->element)
			{
				t = t->left;
			}
			else
			{
				t = t->right;
			}
		}
		return t->element == x;
	}
	void makeEmpty(BinaryNode*& t) //后续遍历,优先删除孩子结点
	{
		stack sta;
		BinaryNode* p = t, * r = nullptr;
		while (p || !sta.empty())
		{
			if (p)
			{
				sta.push(p);
				p = p->left;
			}
			else
			{
				p = sta.top();
				if (p->right != nullptr && p->right != r)
				{
					p = p->right;
				}
				else
				{
					p = sta.top(); sta.pop();
					r = p;
					delete p;
					p = nullptr;
				}
			}
		}
		t = nullptr;
	}
	void printTree(BinaryNode* t, ostream& out) const //中序遍历,迭代法
	{
		stack sta;
		BinaryNode* p = t;
		long long int i = 0;
		while (p || !sta.empty())
		{
			if (p)
			{
				sta.push(p);
				p = p->left;
			}
			else
			{
				p = sta.top();
				sta.pop();
				out << "#" << ++i << ": " << p->element << endl;
				p = p->right;
			}
		}
	}
	BinaryNode* clone(BinaryNode* t) const  //层次遍历复制
	{
		if (t == nullptr)
		{
			return nullptr;
		}

		queue q1, q2;
		BinaryNode* p1, * p2, * newroot = new BinaryNode(t->element, nullptr, nullptr);
		q1.push(t), q2.push(newroot);
		while (!q1.empty())
		{
			p1 = q1.front(); q1.pop();
			p2 = q2.front(); q2.pop();
			if (p1->left)
			{
				q1.push(p1->left);
				p2->left = new BinaryNode(p1->left->element, nullptr, nullptr);
				q2.push(p2->left);

			}
			if (p1->right)
			{
				q1.push(p1->right);
				p2->right = new BinaryNode(p1->right->element, nullptr, nullptr);
				q2.push(p2->right);
			}
		}
		return newroot;

	}



};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/916952.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号