二叉查找树的简单C++实现

本文介绍了一种通用的二叉搜索树(Binary Search Tree)模板类的实现,该类支持插入、删除、查找最小和最大元素等基本操作,并提供了深拷贝等功能。文章详细展示了如何通过递归方式实现这些功能,适用于数据结构初学者和技术面试准备。
#pragma once

template <typename Comparable>
class BinarySearchTree
{
public:
	BinarySearchTree();
	BinarySearchTree(const BinarySearchTree &rhs);
	~BinarySearchTree()
	{
		makeEmpty();
	}

	const Comparable &findMin() const;
	const Comparable &findMax() const;

	bool contains(const Comparable &x) const
	{
		return contains(x,root);
	}

	bool isEmpty() const;
	void printTree() const;

	void makeEmpty();

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

	const BinarySearchTree & operator= (const BinarySearchTree &rhs)
	{
		if(this != &rhs)
		{
			makeEmpty();
			root = clone(rhs.root);
		}
		reuturn *this;
	}

private:
	struct BinaryNode
	{
		Comparable element;
		BinaryNode *left;
		BinaryNode *right;

		BinaryNode(const Comparable & theElement,BinaryNode *lt,BinaryNode *rt)
			:element(theElement),left(lt),right(rt){ }
	};

	BinaryNode *root;

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

	void remove(const Comparable &x,BinaryNode *&t)const
	{
		if(t == NULL)
			return;
		if(x<t->element)
			remove(x,t->left);
		else if(t->element < x)
			remove(x,t->right);
		else if(t->left != NULL && t->right != NULL)
		{
			t->element = findMin(t->right)->element;
			remove(t->element,t->right);
		}
		else
		{
			BinaryNode *oldNode = t;
			t = (t->left != NULL) ? t->left:t->right;
			delete oldNode;
		}
	}

	BinaryNode * findMin(BinaryNode *t)const
	{
		if(t==NULL)
			return NULL;
		if(t->left ==NULL)
			return t;
		return findMin(t->left);
	}

	BinaryNode * findMax(BinaryNode *t)const
	{
		if(t != NULL)
			while(t->right != NULL)
				t = t->right;
		return t;
	}
	bool contains(const Comparable &x,BinaryNode *t)const
	{
		if(t == NULL)
			return false;
		else if(x<t->element)
			return contains(x,x->left);
		else if(t->element<x)
			return contains(x,t->right);
		else
			return true;
	}
	void makeEmpty(BinaryNode *&t)
	{
		if(t != NULL)
		{
			makeEmpty(t->left);
			makeEmpty(t->right);
			delete t;
		}
		t = NULL;
	}
	void printTree(BinaryNode *t)const
	{
		if(t != NULL)
		{
			//printf(t->element);
			printTree(t->left);
			printTree(t->right);
		}
	}
	BinaryNode * clone(BinaryNode *t)const
	{
		if(t == NULL)
			return NULL;
		return new BinaryNode(t->element,clone(t->left),clone(t->right));
	}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值