比较全的二叉查找树(BinarySearchTree)的实现

新年到!中大黑熊祝大家新年快乐!在这里,po上二叉查找树的比较全的实现,我自己整理的,没有测试过,希望有错的能和我说一声,赐教赐教一下我哈!

#ifndef BinaryTree_H
#define BinaryTree_H

template<typename T>
struct BinaryNode
{
	T element;
	BinaryNode * left;
	BinaryNode * right;
	BinaryNode(const T & theElement,BinaryNode *lt = NULL,BinaryNode *rt = NULL):element(theElement),left(lt),right(rt) {}
};
template<typename T>
class BinarySearchTree
{
public:
	BinarySearchTree();
	BinarySearchTree(const BinarySearchTree & rhs);
	~BinarySearchTree();

	const T & findMin() const;
	const T & findMax() const;
	bool contains(const T & x) const;
	bool isEmpty() const;
	void printTree() const;

	void makeEmpty();
	void insert(const T & x);
	void remove(const T & x);

	const BinarySearchTree & operator=(const BinarySearchTree & rhs);

	int countNodes() const;
	int countLeaves() const;
	int countFull() const;

	bool check() const;
	
	//在树上查找k1<=Keys(X)<=k2的值
	void printRange(T & lower,T & upper,BinaryNode<T>* &root); 

private:


	BinaryNode * root;

	void insert(const T & x,BinaryNode * &t) const
	{
		if(t == NULL)
			t = new BinaryNode(x);
		else if(x < t->element)
			insert(x,t->left);
		else if(x > t->element)
			insert(x,t->right);
		else
			;
	}
	void remove(const T & x,BinaryNode * &t) const
	{
		if(t == NULL)
			return ;
		if(x < t->element)
			remove(x,t->left);
		else if(x > t->element)
			remove(x,t->right);
		else if(t->left != NULL && t->right != NULL)  //Two children
		{
			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;
		else
		{
			while(t->left != NULL)
				t = t->left;
			return t;
		}
	}
	BinaryNode * findMax(BinaryNode * t) const
	{
		if(t == NULL)
			return NULL;
		else
		{
			while(t->right != NULL)
				t = t->right;
			return t;
		}
	}
	bool contains(const T & x,BinaryNode *t) const
	{
		if(t == NULL)
			return false;
		else if(x < t->element)
			return contains(x,t->left);
		else if(c > t->element)
			return contains(x,t->right);
		else
			return true;
	}
	void makeEmpty(BinaryNode *t) const
	{
		if(t == NULL)
			;
		else
		{
			makeEmpty(t->left);
			makeEmpty(t->right);
			delete t;
		    t = NULL;
		}
	}
	BinaryNode * clone(BinaryNode * t) const
	{
		if(t == NULL)
			return NULL;
		else
			return new BinaryNode(t->element,clone(t->left),clone(t->right));
	}
	void printTree(BinaryNode * &t) const
	{//这里采用中缀遍历
		cout << t->element << endl;
		printTree(t->left);
		printTree(t->right);
	}

	//统计t中结点的个数
	int countNodes(BinaryNode * &t) const
	{
		if(t==NULL)
			return 0;
		else
			return countNodes(t->left)+countNodes(t->right)+1;
	}
	
	//统计t中树叶的片数
	int countLeaves(BinaryNode * &t) const
	{
		if(t == NULL)
			return 0;
		else if(t->left == NULL && t->right == NULL)
			return 1;
		else
			return countLeaves(t->left)+countLeaves(t->right);
	}

	//统计t中满结点的个数
	int countFull(BinaryNode * &t) const
	{
		if(t == NULL)
			return 0;
		int tIsFull = (t->left != NULL && t->right != NULL) ? 1:0;
		return tIsFull + countFull(t->left) + countFull(t->right);
	}

	//测试一棵二叉树是否在每一个结点都满足查找树的序的性质
	bool check(BinaryNode * &t) const
	{
		if(t->left == NULL && t->right == NULL)
			return true;
		else if(!(t->element > findMin(t)->element && t->element < findMax(t)->element))
			return false;
		check(t->left);
		check(t->right);
	}
};


#endif

 

#include "BinaryTree.h"
#include <iostream>
using namespace std;

template<typename T>
BinarySearchTree<T>::BinarySearchTree()
{
	root = NULL;
}

template<typename T>
BinarySearchTree<T>::BinarySearchTree(const BinarySearchTree & rhs)
{
	root = NULL;
	*this = rhs;
}

template<typename T>
BinarySearchTree<T>::~BinarySearchTree()
{
	makeEmpty();
}

template<typename T>
const T & BinarySearchTree<T>::findMin() const
{
	if(!isEmpty())
		return findMin(root)->element;
}

template<typename T>
const T & BinarySearchTree<T>::findMax() const
{
	if(!isEmpty())
		return findMax(root)->element;
}

template<typename T>
bool BinarySearchTree<T>::contains(const T & x) const
{
	return contains(x,root);
}

template<typename T>
bool BinarySearchTree<T>::isEmpty() const
{
	return root == NULL;
}

template<typename T>
void BinarySearchTree<T>::printTree() const
{
	if(isEmpty())
		cout << "Empty tree." << endl;
	else
		printTree(root);
}

template<typename T>
void BinarySearchTree<T>::makeEmpty()
{
	makeEmpty(root);
}

template<typename T>
void BinarySearchTree<T>::insert(const T & x)
{
	insert(x,root);
}

template<typename T>
void BinarySearchTree<T>::remove(const T & x)
{
	remove(x,root);
}


/* Deep Copy*/

template<typename T>
const BinarySearchTree<T> &BinarySearchTree<T>::operator=(const BinarySearchTree<T> & rhs)
{
	if( this != &rhs )
	{
		makeEmpty();
		root = clone(rhs.root);
	}
	return *this;
}


template<typename T>
int BinarySearchTree<T>::countNodes() const
{
	return countNodes(root);
}

template<typename T>
int BinarySearchTree<T>::countLeaves() const
{
	return countLeaves(root);
}

template<typename T>
int BinarySearchTree<T>::countFull() const
{
	return countFull(root);
}

template<typename T>
bool BinarySearchTree<T>::check() const
{
	return check(root);
}

template<typename T>
void BinarySearchTree<T>::printRange(T & lower,T & upper,BinaryNode<T>* &root)
{
	if(root != NULL)
	{
		if(lower <= t->element)
			printRange(lower,upper,root->left);
		if(lower <= t->element && t->element >= upper)
			cout << t->element << endl;
		if(t->element <= upper)
			printRange(lower,upper,root->right);
	}
}

 

posted @ 2013-02-12 00:27  中大黑熊  阅读(1345)  评论(0编辑  收藏  举报