⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 binarysearchtree.h

📁 二叉树
💻 H
字号:
//实现二叉搜索树的类定义、插入、删除、查找操作

# ifndef BINARY_SEARCH_TREE
# define BINARY_SEARCH_TREE

#include<iostream.h>
#include<math.h>
#include"Queue.h"

template<class T>
class BSTNode {             // 一般搜索二叉树的节点定义
public:
    BSTNode() { 
        left = right = 0; 
    }
    BSTNode(const T& el, BSTNode<T> *l = 0, BSTNode<T> *r = 0) {
        key = el; left = l; right = r; 
    }
    T key;
    BSTNode<T> *left, *right;
};
//--------------------------------------------------------------------
template<class T>
class BinarySearchTree  {     //一般二叉搜索树的类定义,后面为了简单,写作BST代替BinarySearchTree
public:
    BinarySearchTree()
	{
		root=0;
	}
	BinarySearchTree(BSTNode<T>* r)
	{
		root=r;
	}
	void setRoot(BSTNode<T>* r)  {root=r;}
    BSTNode<T>* getRoot() const  { return root;}
	int countHeight(BSTNode<T> *t);                   //计算高度
	void makeBST();
    void insertBSTNode(T k);
	bool findBSTNode(T k);
	void findAndDelete(T k);
	void deleteByMerging(BSTNode<T>*& node);
    void deleteByCopying(BSTNode<T>*& node);
	bool isTreeBalanced(BSTNode<T>* r);
	bool isTreeCompletelyBalanced(BSTNode<T>* r,int& i);
	bool isTreePerfect();
	void balance(T data[],int first,int last);
	
    void preOrder(BSTNode<T>* r);
	void inOrder(BSTNode<T>* r);
	void postOrder(BSTNode<T>* r);


	/*BSTNode<T>* makeBinaryTree(BSTNode<T>* r);
	BSTNode<T>* makeBinaryTree(BSTNode<T>* r,T el);
	void makeBinaryTree(const T& el,BinaryTree<T>& left,BinaryTree<T>& right);
	void preOrder(BSTNode<T>* r);
	void iterativePreOrder();
	void inOrder(BSTNode<T>* r);
	void iterativeInOrder();
	void postOrder(BSTNode<T>* r);
	void iterativePostOrder();
	BSTNode<T> * PreInToTree(BSTNode<T> *root,TNode<T>* ph,TNode<T>* ih);
	BSTNode<T> * InPostToTree(BSTNode<T> *r,TNode<T>* ih,TNode<T>* poh);*/

	//int countAllNode(BSTNode<T>* r);
    //int countLeafNode(BSTNode<T>* r);
	//int countRightNode(BSTNode<T>* r);
	//void deleteLeafNode(BSTNode<T>* r);
private:
	BSTNode<T>* root;
};


template <class T>
int BinarySearchTree<T>::countHeight(BSTNode<T> *t) //返回树*t的高度
{
	if(!t) return 0;
	int hl=countHeight(t->left);
	int hr=countHeight(t->right);
	if(hl>hr) return ++hl;
	else return ++hr;
}
template<class T>
void BinarySearchTree<T>::preOrder(BSTNode<T>* r)
{
	if(r)
	{
		cout<<r->key<<' ';
		preOrder(r->left);
		preOrder(r->right);
	}
}
template<class T>
void BinarySearchTree<T>::inOrder(BSTNode<T>* r)
{
	if(r)
	{
		inOrder(r->left);
		cout<<r->key<<' ';
		inOrder(r->right);
	}
}
template<class T>
void BinarySearchTree<T>::postOrder(BSTNode<T>* r)
{
	if(r)
	{	
		postOrder(r->left);
		postOrder(r->right);
		cout<<r->key<<' ';
	}
}

template<class T>
void BinarySearchTree<T>::makeBST()
{
	BSTNode<T>* r=root;
	T k;
	cout<<"Input the key you want to insert(-1 to end).\n";
	cin>>k;
	while(k!=-1)
	{	
		insertBSTNode(k);
	
	cout<<"Input the key you want to insert(-1 to end).\n";
	cin>>k;
	}
}
template<class T>
bool BinarySearchTree<T>::findBSTNode(T k)
{
	BSTNode<T>* p=0;
	if(root==0)
	{
		cout<<"Tree is empty!\n";
		return 0;
	}
	else
	{	
		BSTNode<T>* t=root;
		while(t!=0)
		{
			p=t;
			if(t->key==k)
				return 1;		
			else if(t->key<k)
			    t=t->right;
			else
				t=t->left;				
		}
		return 0;
	}

}
template<class T>
void BinarySearchTree<T>::insertBSTNode(T k)
{
	BSTNode<T>* p=0;
	if(root==0)
	{
		root=new BSTNode<T>(k);
	}
	else
	{	
		BSTNode<T>* t=root;
	
		while(t!=0)
		{
			p=t;
			if(t->key>k)
				t=t->left;
			else if(t->key<k)
			    t=t->right;
			else
			{
				cout<<"The key has existed in the tree,you can't insert it any more.\n";
				return ;
			}			
		}
		if(p->key>k)
			p->left=new BSTNode<T>(k);
		else
			p->right=new BSTNode<T>(k);
	}
}

template<class T>
void BinarySearchTree<T>::deleteByMerging(BSTNode<T>*& node) {   
    BSTNode<T> *tmp = node;
    if (node != 0) {
        if (node->right==0)           
             node = node->left;    
        else if (node->left == 0)   
             node = node->right;    
        else {                      
             tmp = node->left;      
             while (tmp->right != 0)
                tmp = tmp->right;
             tmp->right = node->right;                                            
             tmp = node;            
             node = node->left;    
        }
        delete tmp;                 
     }
}
template<class T>
void BinarySearchTree<T>::deleteByCopying(BSTNode<T>*& node) 
{    
    BSTNode<T> *previous, *tmp = node;
     if (node->right == 0)                  // node has no right child;
          node = node->left;   
     else if (node->left == 0)              // node has no left child;
          node = node->right;
     else {
          tmp = node->left;                 // node has both children;
          previous = node;                  // 1.
          while (tmp->right != 0) {         // 2.
              previous = tmp;
              tmp = tmp->right;
          }
          node->key = tmp->key;             // 3.
          if (previous == node)
               previous->left  = tmp->left;
          else previous->right = tmp->left; // 4.
     }
     delete tmp;                            // 5.
}
template<class T>
void BinarySearchTree<T>::findAndDelete(T k)
{
	BSTNode<T>* n=root, *pre=0;
	while(n!=0)
	{
		if(n->key==k)  break;     //寻找
		pre=n;
		if(n->key>k)
			n=n->left;
		else
			n=n->right;
	}
	if(n->key!=k)                 //找不到
	{
		cout<<"No such node include the key!\n";
		return;
	}
	if(n->left==0&&n->right==0)   //删除叶子节点
	{
		if(pre->left==n)
		{
			pre->left=0;
            delete n;
		}
		else
		{
			pre->right=0;
			delete n;
		}
	}
	else if(n->left==0)        //被删的左孩子空
	{
		if(pre->left==n)
		{
			pre->left=n->left;
		    delete n;
		}
		else
		{
			pre->right=n->right;
		    delete n;
		}
	}
	else if(n->right==0)        //被删的右孩子空
	{
		if(pre->left==n)
		{
			pre->left=n->left;
		    delete n;
		}
		else
		{
			pre->right=n->right;
		    delete n;
		}
	}
	else           //左右都不为空
	{
		if(pre->left==n)
			deleteByMerging(pre->left);
		else
			deleteByMerging(pre->right);
	}

}
template<class T>
bool BinarySearchTree<T>::isTreeBalanced(BSTNode<T>* r)
{
	int lflag,rflag;
	if(r!=0)
	{
	    int leftHeight=countHeight(r->left);
	    int rightHeight=countHeight(r->right);
		if(fabs(leftHeight-rightHeight)>1)
			return 0;
		else
		{
		    lflag=isTreeBalanced(r->left);
			rflag=isTreeBalanced(r->right);
		}
	}
	else
		return 1;
	if(rflag&&lflag)
		return 1;
	else
        return 0;
}

template<class T>
bool BinarySearchTree<T>::isTreeCompletelyBalanced(BSTNode<T>* r,int& i)
{
	int h=countHeight(root);
	if(r==0)
	{
		if(fabs(h-i)<1)
			return 1;
		else
			return 0;
	}

    int leftbool=isTreeCompletelyBalanced(r->left,++i);
	int rightbool=isTreeCompletelyBalanced(r->right,++i);
	if(leftbool&&rightbool)
		return 1;
	else
		return 0;
}


	//判断一棵树是不是完全二叉树
	/*Queue<BSTNode<T>*> queue;
    BSTNode<T> *p = root;
    if (p != 0) {
        queue.enqueue(p);
        while (!queue.IsEmpty()) 
		{
            queue.dequeue(p);

            if (p->left != 0)
                 queue.enqueue(p->left);
			else 
			{
				if(p->right != 0)
				    return 0;
				else
				{
					queue.dequeue(p);
					if(p->left||p->right)
						return 0;
					else 
						return 1;
				}					
			}
            if (p->right != 0)
                 queue.enqueue(p->right);
        }
}
	return 1;*/

template<class T>
void BinarySearchTree<T>::balance(T data[],int first,int last)
{
    if (first <= last) 
	{
        int middle = (first + last)/2;
        insertBSTNode(data[middle]);
        balance(data,first,middle-1);
        balance(data,middle+1,last);
    }
}

# endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -