返回顶部

收藏

二叉树(数据结构)

更多
#ifndef _BITREE_
#define _BITREE_

#include <iostream>
#include <string>
using namespace std;

template <class T>
struct BiNode   //二叉树的结点结构
{
  T data;       
  BiNode<T> * leftChild;
  BiNode<T> * rightChild;
};

template <class T>
class BiTree
{
public:
    BiTree();             //构造函数,初始化一棵二叉树,其前序序列由键盘输入
    ~BiTree();         //析构函数,释放二叉链表中各结点的存储空间
 BiNode<T> * Getroot();  //获得指向根结点的指针
    void PreOrder(BiNode<T> * root);     //前序遍历二叉树
    void InOrder(BiNode<T> * root);      //中序遍历二叉树
    void PostOrder(BiNode<T> * root);    //后序遍历二叉树
    void LeverOrder(BiNode<T> * root);   //层序遍历二叉树
private:
    BiNode<T> * root;         //指向根结点的头指针
    BiNode<T> * Creat( );     //构造函数调用
    void Release(BiNode<T> * root);   //析构函数调用 
};

/****************************************************/
/*        定义类中的成员函数                               */
/****************************************************/

/*
 *前置条件:二叉树不存在
 *输    入:无
 *功    能:构造一棵二叉树
 *输    出:无
 *后置条件:产生一棵二叉树 
 */
template <class T>
BiTree<T>::BiTree()
{
 this->root = Creat();
}

/*
 *前置条件:二叉树已存在
 *输    入:无
 *功    能:释放二叉链表中各结点的存储空间
 *输    出:无
 *后置条件:二叉树不存在 
 */
template <class T>
BiTree<T>::~BiTree()
{
 Release(root);
}

/*
 *前置条件:二叉树已存在
 *输    入:无
 *功    能:获取指向二叉树根结点的指针
 *输    出:指向二叉树根结点的指针
 *后置条件:二叉树不变 
 */
template <class T>
BiNode<T> * BiTree<T>::Getroot( )
{
 return root;
}

/*
 *前置条件:二叉树已存在
 *输    入:无
 *功    能:前序遍历二叉树
 *输    出:二叉树中结点的一个线性排列
 *后置条件:二叉树不变 
 */
template <class T>
void BiTree<T>::PreOrder(BiNode<T> * root)
{
 if(root==NULL)
  return;
 else
 {  
  cout<<root->data<<" ";
        PreOrder(root->leftChild);
  PreOrder(root->rightChild);
 }
}

/*
 *前置条件:二叉树已存在
 *输    入:无
 *功    能:中序遍历二叉树
 *输    出:二叉树中结点的一个线性排列
 *后置条件:二叉树不变 
 */
template <class T>
void BiTree<T>::InOrder (BiNode<T> * root)
{
    if(root==NULL)
  return;      //递归调用的结束条件           
    else
 { 
        InOrder(root->leftChild);    //中序递归遍历root的左子树
        cout<<root->data<<" ";    //访问根结点的数据域
        InOrder(root->rightChild);    //中序递归遍历root的右子树
 }
}

/*
 *前置条件:二叉树已存在
 *输    入:无
 *功    能:后序遍历二叉树
 *输    出:二叉树中结点的一个线性排列
 *后置条件:二叉树不变 
 */
template <class T>
void BiTree<T>::PostOrder(BiNode<T> * root)
{ 
    if(root==NULL)
  return;       //递归调用的结束条件
    else
 { 
        PostOrder(root->leftChild);    //后序递归遍历root的左子树
        PostOrder(root->rightChild);    //后序递归遍历root的右子树
        cout<<root->data<<" ";      //访问根结点的数据域
 }
}

/*
 *前置条件:二叉树已存在
 *输    入:无
 *功    能:层序遍历二叉树
 *输    出:二叉树中结点的一个线性排列
 *后置条件:二叉树不变
 */
template <class T>
void BiTree<T>::LeverOrder(BiNode<T> * root)
{
 const int MaxSize = 100;
 int front = 0;
 int rear = 0;  //采用顺序队列,并假定不会发生上溢
 BiNode<T>* Q[MaxSize];
    BiNode<T>* q;
 if (root==NULL)
  return;
 else
 {
  Q[rear++] = root;
  while (front != rear)
  {
   q = Q[front++];
       cout<<q->data<<" ";   
      if (q->leftChild != NULL)
    Q[rear++] = q->leftChild;  
   if (q->rightChild != NULL)
    Q[rear++] = q->rightChild;
  }
 }
}

/*
 *前置条件:空二叉树
 *输    入:数据ch;
 *功    能:初始化一棵二叉树,构造函数调用
 *输    出:无
 *后置条件:产生一棵二叉树
 */
template <class T>
BiNode<T> * BiTree<T>::Creat( )
{
 BiNode<T> * root;
 T ch;
 cout<<"请输入创建一棵二叉树的结点数据"<<endl;
 cin>>ch;
    if (ch=="#")
  root = NULL;
    else
 { 
      root = new BiNode<T>;       //生成一个结点
         root->data=ch;
         root->leftChild = Creat( );    //递归建立左子树
         root->rightChild = Creat( );    //递归建立右子树
    } 
    return root;
}

/*
 *前置条件:二叉树已经存在
 *输    入:无
 *功    能:释放二叉树的存储空间,析构函数调用
 *输    出:无
 *后置条件:二叉树不存在
 */
template <class T>
void BiTree<T>::Release(BiNode<T> * root)
{
  if (root != NULL)
  {                  
   Release(root->leftChild);   //释放左子树
      Release(root->rightChild);   //释放右子树
      delete root;
  }  
}

#endif
//该片段来自于http://outofmemory.cn

标签:c++,算法

收藏

0人收藏

支持

0

反对

0

»更多 您可能感兴趣的代码
  1. 2014-10-01 11:18:28C++算法之寻找丢失的数 by 蟋蟀哥
  2. 2014-10-07 11:01:20无向图 by niutao.linux
  3. 2014-10-22 13:04:13A星算法 by 灵剑子
  4. 2014-12-06 11:00:26词法分析 by 童学芬
  5. 2012-11-03 19:21:55c语言实现顺序查找和二分查找的示例 by 林峰
  6. 2012-12-06 21:23:15c++大数阶乘算法 by zetaliang
  7. 2012-12-20 13:30:20伪造硬币问题 by 傅小黑
  8. 2013-07-27 15:09:08C++顺序表操作代码演示 by qqmmcc
  9. 2014-04-05 14:40:50C++算法之可变参数 by 童学芬
  10. 2014-05-18 11:40:55KMP字符串匹配算法 by 童学芬
  11. 2014-05-19 15:46:15高效素数筛法 by lucasli

发表评论