【头文件】c++实现二叉树

原创 2004年07月15日 14:33:00

 #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

二叉树的C++模板类头文件源代码实现

顺序存储的二叉树结构利用数组给满二叉树进行编号,而实际情况中的二叉树不满足满二叉树和完全二叉树,因此会导致内存空间的浪费,所以本文采用链表的存储方式,定义树节点结构体,包含数据和两个左右儿子指针。类的...
  • Alex123980
  • Alex123980
  • 2016年06月01日 17:14
  • 1936

用C++实现一个二叉树类

我以为自己复习得差不多了,但是从昨天的笔试看来,基础真的很不扎实. 一个二叉树类也写不出来,即使是今天,也要调试半天./**//** 昨天参加宜搜的笔试,要求用C++写一二叉树类,实现插入,删除,定位...
  • apaolove
  • apaolove
  • 2007年11月04日 16:34
  • 6252

用C++实现二叉树

#include using namespace std; template class BinarySearchTree { public: BinarySearchTree():root(...
  • yaoxiaokui
  • yaoxiaokui
  • 2015年10月18日 17:48
  • 159

二叉树C++实现数据结构实验

二叉树结构的C++实现,递归和非递归遍历方法, 1. 按先序序列构造一棵二叉链表表示的二叉树T; 2. 对这棵二叉树进行遍历:先序、中序、后序以及层次遍历,分别输出结点的遍历序列; 3. 求二叉树的深...
  • zhembrace
  • zhembrace
  • 2016年10月30日 20:50
  • 2791

二叉树c++模板实现

二叉树c++模板实现
  • zhengzhongwu
  • zhengzhongwu
  • 2017年01月23日 15:01
  • 699

c++之stl 二叉树

set是根据元素值进行排序的集合,所插入的元素在集合中唯一,不存在重复元素。 set由二叉搜索树实现,并且对树进行了平衡处理,使得元素在树中分部较为均匀,因此能保持搜索、插入、删除的复杂度在O(log...
  • update7
  • update7
  • 2017年03月07日 12:51
  • 24335

二叉树基本功能的汇集(C++类实现)

二叉树是程序应用得比较多的一种结构。它可以反映物体之间的层次结构,还能通过孩子和双亲反映两物体之间某些特殊关系;排序二叉树还能帮助我们进行排序,并因此而提供快速的查找;二叉树基础上的伸展树能不断地优化...
  • iqRocket
  • iqRocket
  • 2012年12月06日 18:13
  • 15983

C++类实现二叉树的构建和遍历

#include #include #include using namespace std; /*二叉树的结构体*/ typedef struct BTree { int val; str...
  • u014453898
  • u014453898
  • 2017年02月06日 17:03
  • 997

基于C++类和指针实现二叉树

1、二叉树的定义   二叉树(Binary Tree)是一种特殊的树型结构,每个节点至多有两棵子树,且二叉树的子树有左右之分,次序不能颠倒。   由定义可知,二叉树中不存在度(结点拥有的子树数目)...
  • hongkangwl
  • hongkangwl
  • 2014年03月21日 10:10
  • 6099

C++ 简单二叉树实现

c++ 简单二叉树实现 基本的构造,先序、中序、后序遍历功能。#ifndef BINTREE_H #define BINTREE_H#include using namespace std; ty...
  • chenxl929
  • chenxl929
  • 2017年03月30日 17:55
  • 198
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【头文件】c++实现二叉树
举报原因:
原因补充:

(最多只允许输入30个字)