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

📄 genbst.h

📁 通用二叉搜索树
💻 H
字号:
//******************************  genBST.h  ******************************
//               definition of class BST: generic binary search tree
//                             通用二叉搜索树
#ifndef GENBST_H
#define GENBST_H

#include <queue>
#include <string>
#include "BSTNode.h"

using namespace std;

template<class T>
class BST 
{
public:
    BST() { root = 0; }
	~BST();
	BST( BSTNode* p ) { root = p; }
	void insertNode( const T& el );								                   // 插入节点
	void displayTree() const { displayTreeHelper( root, 0 ); }					   // 打印树
	void breadthFirst() const;							                           // 广度优先遍历
	void preOrderTraversal() const{ preOrderHelper(root); }                        // VLR——前序树遍历
	void inOrderTraversal() const{ inOrderHelper(root); }                          // LVR——中序树遍历
	void postOrderTraversal() const{ postOrderHelper(root); }                      // LRV——后序树遍历
	int nodesCount() const{ return nodesCountHelper(root); }                       // 节点数
	int leafCount() const{ return leafCountHelper(root); }                         // 叶子节点数
	int rightChildCount() const { return rightChildCountHelper(root); }            // 右子节点数
	int height() const { return heightHelper(root); }                              // 树的高度
	void deleteLeaves() { deleteLeavesHelper(root); }                              // 删除所有叶子节点
	BSTNode<T>* search(const T& el);											   // 查找节点
	void deleteByMerging(BSTNode<T>* & node) { deleteByMergingHelper(node); }      // 合并删除
    bool findAndDeleteByMerging(const T& el){ return findAndDeleteByMergingHelper(el); }     // 查找并合并删除
	void preInCreateTree(string pre, string in){ preInCreateTreeHelper(pre, in, root); }     // 根据先序中序创建树
	void postInCreateTree(string post, string in){ postInCreateTreeHelper(post, in, root); } // 根据后序中序创建树
private:
	BSTNode<T>* root;	
	/*--------------------utility functions--------------------*/     //利用工具函数实现封装
	void displayTreeHelper( BSTNode<T>*, int ) const;
	void preOrderHelper( BSTNode<T>* ) const;
	void inOrderHelper( BSTNode<T>* ) const;
	void postOrderHelper( BSTNode<T>* ) const;
	int nodesCountHelper( BSTNode<T>* ) const;
	bool isLeafHelper( BSTNode<T>* ) const;
	int leafCountHelper( BSTNode<T>* ) const;
	int rightChildCountHelper( BSTNode<T>* ) const;
	int heightHelper( BSTNode<T>* ) const;
	void deleteLeavesHelper( BSTNode<T>*& );
	void deleteByMergingHelper(BSTNode<T> *& node);
	bool findAndDeleteByMergingHelper(const T& el);
	void preInCreateTreeHelper(string, string, BSTNode<T>*&);
	void postInCreateTreeHelper(string, string, BSTNode<T>*&);		
};
//-------------------------------------------------------------------------
template<class T>
BST<T>::~BST()
{
	while ( root != 0 )
	{
		deleteLeaves();
	}
}
//-------------------------------------------------------------------------
template<class T>                                               // 插入节点
void BST<T>::insertNode( const T& el ) 
{
	BSTNode<T> *cur = root, *prev = 0;
	while ( cur != 0 ) {       // find a place for inserting new node;
		prev = cur;
		if( cur->data < el )
			cur= cur->rc;
		else if( cur->data > el )
			cur = cur->lc;
		else{
			cout << "Data " << el 
				 << " has been found in the tree,and it won't be inserted to the tree!\n";
			return;
		}
	}
	if( root == 0 )
		root = new BSTNode<T>(el);
	else if( prev->data < el )
		prev->rc = new BSTNode<T>(el);
	else
		prev->lc = new BSTNode<T>(el);
}
//-------------------------------------------------------------------------
template<class T>                                           // 广度优先遍历
void BST<T>::breadthFirst() const 
{
	queue< BSTNode<T>* > Q;
	BSTNode<T>* p = root;
	if( p != 0 ) {
		Q.push( p );
		while ( !Q.empty() ) {
			p = Q.front();
			Q.pop();
			cout << p->data << ' ';
			if ( p->lc != 0 )
				Q.push( p->lc );
			if ( p->rc != 0 )
				Q.push( p->rc );
		}
	}
}
//******************** definition of utility functions ****************************
//-------------------------------------------------------------------------
template<class T>                                                 // 打印树
void BST<T>::displayTreeHelper( BSTNode<T>* p, int totalSpaces ) const 
{
	while ( p )
	{
		displayTreeHelper( p->rc, totalSpaces+5 );
		for ( int i = 0; i <= totalSpaces; i++ )
			cout << ends;
		cout << p ->data << endl;
		p = p->lc;
		totalSpaces += 5;
	}
}
//-------------------------------------------------------------------------
template<class T>                                      // VLR——前序树遍历
void BST<T>::preOrderHelper( BSTNode<T>* p ) const
{
	if ( p ) {
		cout << p->data << ' ';
		preOrderHelper( p->lc );
		preOrderHelper( p->rc );
	}
}
//-------------------------------------------------------------------------
template<class T>                                      // LVR——中序树遍历
void BST<T>::inOrderHelper( BSTNode<T>* p ) const 
{
	if( p ) {
		inOrderHelper( p->lc );
		cout << p->data << ' ';
		inOrderHelper( p->rc );
	}
}
//-------------------------------------------------------------------------
template<class T>                                      // LRV——后序树遍历
void BST<T>::postOrderHelper( BSTNode<T>* p ) const 
{
	if( p ) {
		postOrderHelper( p->lc );
		postOrderHelper( p->rc );
		cout << p->data << ' ';	
	}
}
//-------------------------------------------------------------------------
template<class T>                                                 // 节点数
int BST<T>::nodesCountHelper( BSTNode<T>* p ) const 
{
	if( !p )
		return 0;
	else {
		int lcount = nodesCountHelper( p->lc );
		int rcount = nodesCountHelper( p->rc );
		return lcount + rcount + 1;
	}
}
//-------------------------------------------------------------------------
template<class T>                                // 判断某节点是否为叶子节点
bool BST<T>::isLeafHelper( BSTNode<T>* p ) const
{
	if( !p ) {
		cout << "Wrong: isLeafHelper() requires non-null pointer!\n";
		exit(1);
	}
	else
		if( p->lc == 0 && p->rc == 0 )
			return true;
		else
			return false;
}	
//-------------------------------------------------------------------------
template<class T>                                             // 叶子节点数
int BST<T>::leafCountHelper( BSTNode<T>* p ) const 
{
	if( !p )
		return 0;
	else {
		if( isLeafHelper( p ) )
			return 1;
		else {
			int lcount = leafCountHelper( p->lc );
			int rcount = leafCountHelper( p->rc );
			return lcount + rcount;
		}
	}		
}
//-------------------------------------------------------------------------
template<class T>                                             // 右子节点数
int BST<T>::rightChildCountHelper( BSTNode<T>* p ) const 
{
	if( !p )
		return 0;
    else    
    {
		int rcount = rightChildCountHelper( p->rc );
		if( p == root )
			return rcount;
		else
			return rcount + 1;
	}
}
//-------------------------------------------------------------------------
template<class T>                                               // 树的高度
int BST<T>::heightHelper( BSTNode<T> *p ) const {
	if( !p )
		return 0;
	else {
		int lheight = heightHelper( p->lc );
		int rheight = heightHelper( p->rc );
		if( lheight > rheight )
			return ++lheight;
		else
			return ++rheight;
	}	
}
//-------------------------------------------------------------------------
template<class T>                                       // 删除所有叶子节点
void BST<T>::deleteLeavesHelper( BSTNode<T>*& p )
{
	BSTNode<T>* tmp = p;
	if( !p )
		return;
	else if( isLeafHelper(p) ) {
		p = NULL;
		delete tmp;
	}
	else {
		if ( p->lc )
			deleteLeavesHelper( p->lc );
		if ( p->rc )
			deleteLeavesHelper( p->rc );
	}
}
//-------------------------------------------------------------------------
template<class T>                                               // 查找节点
BSTNode<T>* BST<T>::search( const T& el )
{
	BSTNode<T>* p = root;
	while ( p ){
		if( el == p->data )
			return p;
		else if( el < p->data )
			p = p->lc;
		else 
			p = p->rc;
	}
	return 0;
}
//-------------------------------------------------------------------------
template<class T>                                               // 合并删除
void BST<T>::deleteByMergingHelper( BSTNode<T>*& node ) 
{
	BSTNode<T>* tmp = node;
	if( node ) 
	{
		if( !node->rc )				// 右子树为空
			node = node->lc;
		else if( !node->lc )		// 左子树为空
			node = node->rc;
		else {
			tmp = node->lc;         // 1. move left
			while( tmp->rc )        // 2. and then right as far as possible
				tmp = tmp->rc;
			tmp->rc = node->rc;
			tmp = node;
			node = node->lc;
		}
		delete tmp;
	}
}
//-------------------------------------------------------------------------
// 要想访问以被删除节点为根的整个子树,必须从被删除节点的父节点的左或者右指
// 针数据成员中访问该节点,这样才能修改其父节点的左或右指针
template<class T>                                          //查找并合并删除
bool BST<T>::findAndDeleteByMergingHelper( const T& el ) 
{
	BSTNode<T> *p = root, *prev = 0;
	while ( p ) {
		if( el == p->data )
			break;
		prev = p;
		if(el < p->data)
			p = p->lc;
		else 
			p = p->rc;
	}
	if( p && p->data == el )
	{
		if( p == root )
			deleteByMerging( root );
		else if ( p == prev->lc )
			deleteByMerging( prev->lc );
		else
			deleteByMerging( prev->rc );
		return true;
	}
	else if( root )
		cout << "Data " << el << " is not in the tree\n";
	else
		cout << "The tree is empty\n";
	return false;
}
//-------------------------------------------------------------------------
// 使用C++标准库中的string类
// string类提供的substr函数可以读取string的子串。参数1:开始下标;参数2:子串字符数
template<class T>                                      // 根据先序中序创建树
void BST<T>::preInCreateTreeHelper(string pre, string in, BSTNode<T>*& r) 
{
	if( pre.size() == 0 )
		r = NULL;
	else {
		for( int split = 0; split < pre.size(); split++ )
			if ( in[split] == pre[0] )
				break;
		r = new BSTNode<T>( pre[0] );
		preInCreateTreeHelper( pre.substr(1, split), in.substr(0, split), r->lc );
		preInCreateTreeHelper( pre.substr(split+1, pre.size()-split-1), in.substr(split+1, in.size()-split-1), r->rc );	
	}
}
//-------------------------------------------------------------------------
// 使用C++标准库中的string类
// string类提供的substr函数可以读取string的子串。参数1:开始下标;参数2:子串字符数
template<class T>                                      // 根据后序中序创建树
void BST<T>::postInCreateTreeHelper(string post, string in, BSTNode<T>*& r)
{
	if( post.size() == 0 )
		r = NULL;
	else {
		for(int split = 0; split < post.size(); split++ )
			if ( in[split] == post[post.size()-1] )
				break;
		r = new BSTNode<T>( post[post.size()-1] );
		postInCreateTreeHelper( post.substr(0, split), in.substr(0, split), r->lc );
		postInCreateTreeHelper( post.substr(split, post.size()-split-1), in.substr(split+1, in.size()-split-1), r->rc );	
	}
}
//-------------------------------------------------------------------------
#endif

⌨️ 快捷键说明

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