【头文件】c++实现二叉树
2004-07-15 14:33
549 查看
#ifndef BITREE_H
#define BITREE_H
#include <iostream>
using namespace std;
template<typename elemtype> class bitnode
{
public:
bitnode();//构造函数
bitnode( const bitnode& );//拷贝构造函数
const elemtype date () const;//读取数据
const bitnode *lchild () const;//返回左指针
const bitnode *rchild () const;//返回右指针
void get_date( const elemtype );//输入数据
void get_lchild ( const bitnode* );//输入左指针
void get_rchild ( const bitnode* );//输入右指针
bitnode operator =( const bitnode& ); //赋值,只声明
private:
elemtype _date;//节点数据
bitnode *_lchild,*_rchild;//左右孩子指针
};//二叉树的节点
//bitnode类函数实现
template<typename elemtype>
bitnode<elemtype>::bitnode()
{
get_date( 0 );
get_rchild( 0 );
get_lchild( 0 );
}
template<typename elemtype >const
bitnode<elemtype>* bitnode<elemtype>::lchild() const
{
return _lchild;
}
template<typename elemtype> const
bitnode<elemtype>* bitnode<elemtype>::rchild() const
{
return _rchild;
}
template<typename elemtype> const
elemtype bitnode<elemtype>::date () const
{
return _date;
}
template<typename elemtype>
void bitnode<elemtype>::get_date( const elemtype de )
{
_date = de;
}
template<typename elemtype>
void bitnode<elemtype>::
get_lchild( const bitnode *pev)
{
_lchild = ( bitnode* ) pev;
}
template<typename elemtype>
void bitnode<elemtype>::
get_rchild ( const bitnode *pev)
{
_rchild = ( bitnode* ) pev;
}
//tree类
template<typename elemtype> class BiTree
{
public:
BiTree();//构造函数
BiTree( const BiTree& );
const bitnode* copy( const bitnode* );
void print() const;//打印树中数据
const bool empty() const;//测试树是否为空
const int node() const;//返回节点个数
BiTree& operator= ( const BiTree& ); //赋值
private:
int node_nu;//节点个数
bitnode *pv;//根指针
void add_node();//增加节点
const bitnode* init();// 初始化
void fvisit( const bitnode* ) const;//先序遍历
void mvisit( const bitnode* ) const;//中序遍历
void hvisit( const bitnode* ) const;//后序遍历
};
//二叉树类代码实现
//公有函数集合
template<typename elemtype>
BiTree<elemtype>::BiTree()
{
pv = NULL;
node_nu = 0;
pv = ( bitnode* ) init();
}
template<typename elemtype> BiTree<elemtype>::
BiTree( const BiTree& tree )
{
if( tree.empty() )
pv = ( bitnode* ) copy( tree.pv );
}
template<typename elemtype>
void BiTree<elemtype>::print() const
{
cout << "请选择打印顺序:先序[x]?中序[z]?后序[h]?:";
char ch;
cin >> ch;
if ( empty() != 0 )
{
switch ( ch )
{
case 'x': fvisit( pv ); break;
case 'z': mvisit( pv ); break;
case 'h': hvisit( pv ); break;
default: cerr << "错误操作。无法输出!" << endl;
}
}
else
cerr << "树为空" << endl;
}
template<typename elemtype> const
bool BiTree<elemtype>::empty() const
{
if( node_nu == 0 )
return false;
else
return true;
}
template<typename elemtype> const
int BiTree<elemtype>::node() const
{
return node_nu;
}
template<typename elemtype> const
bitnode<elemtype>* BiTree<elemtype>::
copy( const bitnode<elemtype>* ptr )
{
bitnode<elemtype> *pev;
if( ptr == 0 )
return 0;
if ( ptr->date() == 0 )
pev = 0;
else
{
if ( !( pev = new bitnode<elemtype> ) )
return 0 ;
add_node();
pev->get_date( ptr->date() );
pev->get_lchild( copy( ptr->lchild() ) );
pev->get_rchild( copy( ptr->rchild() ) );
}
return pev;
}
template<typename elemtype>
BiTree<elemtype>& BiTree<elemtype>::
operator =( const BiTree<elemtype>& tree )
{
if( tree.empty() )
pv = copy( tree.pv );
return *this;
}
//私有函数集合
template<typename elemtype> const
bitnode<elemtype>* BiTree<elemtype>::init()
{
bitnode<elemtype> *pev;
elemtype de;
cout << "请输入第"
<< node() + 1
<< "个数据:";
cin >> de;
if ( de == 0 )
pev = NULL;
else
{
if ( !( pev = new bitnode<elemtype> ) )
return 0 ;
add_node();
pev->get_date( de );
pev->get_lchild( init() );
pev->get_rchild( init() );
}
return pev;
}
template<typename elemtype>
void BiTree<elemtype>::add_node()
{
++node_nu;
}
template<typename elemtype>
void BiTree<elemtype>::
fvisit( const bitnode<elemtype> *pev ) const
{
if ( pev != NULL )
cout << pev->date() << endl;
if ( pev->lchild() != NULL )
fvisit( pev->lchild() );
if ( pev->rchild() != NULL )
fvisit( pev->rchild() );
}
template<typename elemtype>
void BiTree<elemtype>::
mvisit( const bitnode<elemtype> *pev ) const
{
if ( pev->lchild() != NULL )
mvisit( pev->lchild() );
if ( pev != NULL )
cout << pev->date() << endl;
if ( pev->rchild() != NULL )
mvisit( pev->rchild() );
}
template<typename elemtype>
void BiTree<elemtype>::
hvisit( const bitnode<elemtype> *pev ) const
{
if ( pev->lchild() != NULL )
hvisit( pev->lchild() );
if ( pev->rchild() != NULL )
hvisit( pev->rchild() );
if ( pev != NULL )
cout << pev->date() << endl;
}
#endif
#define BITREE_H
#include <iostream>
using namespace std;
template<typename elemtype> class bitnode
{
public:
bitnode();//构造函数
bitnode( const bitnode& );//拷贝构造函数
const elemtype date () const;//读取数据
const bitnode *lchild () const;//返回左指针
const bitnode *rchild () const;//返回右指针
void get_date( const elemtype );//输入数据
void get_lchild ( const bitnode* );//输入左指针
void get_rchild ( const bitnode* );//输入右指针
bitnode operator =( const bitnode& ); //赋值,只声明
private:
elemtype _date;//节点数据
bitnode *_lchild,*_rchild;//左右孩子指针
};//二叉树的节点
//bitnode类函数实现
template<typename elemtype>
bitnode<elemtype>::bitnode()
{
get_date( 0 );
get_rchild( 0 );
get_lchild( 0 );
}
template<typename elemtype >const
bitnode<elemtype>* bitnode<elemtype>::lchild() const
{
return _lchild;
}
template<typename elemtype> const
bitnode<elemtype>* bitnode<elemtype>::rchild() const
{
return _rchild;
}
template<typename elemtype> const
elemtype bitnode<elemtype>::date () const
{
return _date;
}
template<typename elemtype>
void bitnode<elemtype>::get_date( const elemtype de )
{
_date = de;
}
template<typename elemtype>
void bitnode<elemtype>::
get_lchild( const bitnode *pev)
{
_lchild = ( bitnode* ) pev;
}
template<typename elemtype>
void bitnode<elemtype>::
get_rchild ( const bitnode *pev)
{
_rchild = ( bitnode* ) pev;
}
//tree类
template<typename elemtype> class BiTree
{
public:
BiTree();//构造函数
BiTree( const BiTree& );
const bitnode* copy( const bitnode* );
void print() const;//打印树中数据
const bool empty() const;//测试树是否为空
const int node() const;//返回节点个数
BiTree& operator= ( const BiTree& ); //赋值
private:
int node_nu;//节点个数
bitnode *pv;//根指针
void add_node();//增加节点
const bitnode* init();// 初始化
void fvisit( const bitnode* ) const;//先序遍历
void mvisit( const bitnode* ) const;//中序遍历
void hvisit( const bitnode* ) const;//后序遍历
};
//二叉树类代码实现
//公有函数集合
template<typename elemtype>
BiTree<elemtype>::BiTree()
{
pv = NULL;
node_nu = 0;
pv = ( bitnode* ) init();
}
template<typename elemtype> BiTree<elemtype>::
BiTree( const BiTree& tree )
{
if( tree.empty() )
pv = ( bitnode* ) copy( tree.pv );
}
template<typename elemtype>
void BiTree<elemtype>::print() const
{
cout << "请选择打印顺序:先序[x]?中序[z]?后序[h]?:";
char ch;
cin >> ch;
if ( empty() != 0 )
{
switch ( ch )
{
case 'x': fvisit( pv ); break;
case 'z': mvisit( pv ); break;
case 'h': hvisit( pv ); break;
default: cerr << "错误操作。无法输出!" << endl;
}
}
else
cerr << "树为空" << endl;
}
template<typename elemtype> const
bool BiTree<elemtype>::empty() const
{
if( node_nu == 0 )
return false;
else
return true;
}
template<typename elemtype> const
int BiTree<elemtype>::node() const
{
return node_nu;
}
template<typename elemtype> const
bitnode<elemtype>* BiTree<elemtype>::
copy( const bitnode<elemtype>* ptr )
{
bitnode<elemtype> *pev;
if( ptr == 0 )
return 0;
if ( ptr->date() == 0 )
pev = 0;
else
{
if ( !( pev = new bitnode<elemtype> ) )
return 0 ;
add_node();
pev->get_date( ptr->date() );
pev->get_lchild( copy( ptr->lchild() ) );
pev->get_rchild( copy( ptr->rchild() ) );
}
return pev;
}
template<typename elemtype>
BiTree<elemtype>& BiTree<elemtype>::
operator =( const BiTree<elemtype>& tree )
{
if( tree.empty() )
pv = copy( tree.pv );
return *this;
}
//私有函数集合
template<typename elemtype> const
bitnode<elemtype>* BiTree<elemtype>::init()
{
bitnode<elemtype> *pev;
elemtype de;
cout << "请输入第"
<< node() + 1
<< "个数据:";
cin >> de;
if ( de == 0 )
pev = NULL;
else
{
if ( !( pev = new bitnode<elemtype> ) )
return 0 ;
add_node();
pev->get_date( de );
pev->get_lchild( init() );
pev->get_rchild( init() );
}
return pev;
}
template<typename elemtype>
void BiTree<elemtype>::add_node()
{
++node_nu;
}
template<typename elemtype>
void BiTree<elemtype>::
fvisit( const bitnode<elemtype> *pev ) const
{
if ( pev != NULL )
cout << pev->date() << endl;
if ( pev->lchild() != NULL )
fvisit( pev->lchild() );
if ( pev->rchild() != NULL )
fvisit( pev->rchild() );
}
template<typename elemtype>
void BiTree<elemtype>::
mvisit( const bitnode<elemtype> *pev ) const
{
if ( pev->lchild() != NULL )
mvisit( pev->lchild() );
if ( pev != NULL )
cout << pev->date() << endl;
if ( pev->rchild() != NULL )
mvisit( pev->rchild() );
}
template<typename elemtype>
void BiTree<elemtype>::
hvisit( const bitnode<elemtype> *pev ) const
{
if ( pev->lchild() != NULL )
hvisit( pev->lchild() );
if ( pev->rchild() != NULL )
hvisit( pev->rchild() );
if ( pev != NULL )
cout << pev->date() << endl;
}
#endif
相关文章推荐
- 二叉树的后序遍历非递归算法之c++实现
- 在C++中实现文件的读写的基本方法
- 用C++实现简单的文件I/O操作
- 用C++实现遍历指定目录下的[指定文件后缀名]文件
- 用C++实现文件I/O操作
- C++实现文件删除
- 【头文件】c++实现字符串
- 用C++实现简单的文件I/O操作(ifstream,ofstream)
- 在编写C++的Dll文件中实现int到char*转换
- 用C++实现二叉树(转)
- 《数据结构与算法分析C++描述》 搜索二叉树的C++实现
- 用C++实现简单的文件I/O操作
- c/c++头文件与cpp文件的切换实现
- 数据结构复习:几种排序算法的C++实现和二叉树的相关算法实现
- 用C++实现二叉树
- C++ 接口与实现分离技术---如何将文件间的编译关系降至最低
- 用C++实现简单的文件I/O操作
- c++实现对文件目录树形打印
- 用C++实现简单的文件I/O操作
- 用C++实现简单的文件I/O操作