您的位置:首页 > 理论基础 > 数据结构算法

数据结构之二叉树_BinTree

2015-11-23 19:57 309 查看
#ifndef BINTREE_H_INCLUDED

#define BINTREE_H_INCLUDED

#include<iostream>

#include <queue>

using std::cin;

using std::cout;

using std::endl;

template<class T>

class BinTreeNode//二叉树的节点声明

{

private:

 BinTreeNode<T>* left, *right;

 T data;

public:

 BinTreeNode(const T& item, BinTreeNode<T>* lptr = NULL, BinTreeNode<T>* rptr = NULL) :

  data(item), left(lptr), right(rptr) {}

 T& GetData(){ return data; }//返回二叉树结点的引用

 BinTreeNode<T>* & GetLeft(){ return left; }//返回左指针引用

 BinTreeNode<T>* & GetRight(){ return right; }//返回右指针引用

};

template<class T>

class BinTree

{

private:

 BinTreeNode<T>* root;

 T stop;

public:

 BinTree(BinTreeNode<T>* t = NULL,T rstop='#') :root(t),stop(rstop){ }

 ~BinTree(){ DeleteBinTree(root); }

 BinTreeNode<T>* CreatBinTree();//先根序列构造二叉树

 void PreOrder(BinTreeNode<T>* t) const;//先根遍历

 void InOrder(BinTreeNode<T>* t) const;//中跟遍历

 void PostOrder(BinTreeNode<T>* t)const;//后跟遍历

 void LevelOrder(BinTreeNode<T>* t)const;//层次遍历

 BinTreeNode<T>* FatherNode(BinTreeNode<T>* t, BinTreeNode<T>* p);//查找p的父节点

 BinTreeNode<T>* FindData(BinTreeNode<T>* t, const T& item);//查找职位item的节点

 void DeleteBinTree(BinTreeNode<T>* t);//删除节点为t的树(包括t节点)

 BinTreeNode<T>* GetRoot()const { return root; }//返回跟节点指针

};

//创建二叉树

template<class T>

BinTreeNode<T>* BinTree<T>::CreatBinTree()

{

 BinTreeNode<T>* newroot;

 T ch;

 cout << "请输入二叉树的结点:";

 cin >> ch;

 if (ch == stop)

 {

  newroot = NULL;

 }

 else

 {

  newroot = new BinTreeNode<T>(ch);//创建新节点

  newroot->GetLeft() = CreatBinTree();//左指针指向左孩子

  newroot->GetRight() = CreatBinTree();//右指针指向右孩子

 }

 root = newroot;

 return newroot;

}

//先根遍历

template<class T>

void BinTree<T>::PreOrder(BinTreeNode<T>* t) const

{

 if (t != NULL)

 {

  cout << t->GetData();

  PreOrder(t->GetLeft());

  PreOrder(t->GetRight());

 }

}

//中根遍历

template<class T> void BinTree<T>::InOrder(BinTreeNode<T>* t) const

{

 if (t != NULL)

 {

  InOrder(t->GetLeft());

  cout << t->GetData();

  InOrder(t->GetRight());

 }

}

//后跟遍历

template<class T> void BinTree<T>::PostOrder(BinTreeNode<T>* t) const

{

 if (t != NULL)

 {

  PostOrder(t->GetLeft());

  PostOrder(t->GetRight());

  cout << t->GetData();

 }

}

//层次遍历

template <class T>

void BinTree<T> ::LevelOrder(BinTreeNode<T>* t)const

{

 if (t == NULL) return;

 BinTreeNode<T> *p;

 std::queue<BinTreeNode<T>*> ATreeQueue;

 if (t != NULL)

  ATreeQueue.push(t);

 while (!ATreeQueue.empty())

 {

  p = ATreeQueue.front();

  cout << p->GetData();

  ATreeQueue.pop();

  //因为二叉树不像树,只有两个孩子,看完左孩子,再看右孩子就可以

  if ((p->GetLeft()) != NULL)

   ATreeQueue.push(p->GetLeft());//先看左孩子

  if ((p->GetRight()) != NULL)

   ATreeQueue.push(p->GetRight());//再看右孩子

 }

}

//父节点

template <class T>

BinTreeNode<T>* BinTree<T>::FatherNode(BinTreeNode<T>* t, BinTreeNode<T>* p)

{

 BinTreeNode<T>* temp;

 if (t == NULL)

  return NULL;

 if (p == t->GetLeft() || p == t->GetRight())

  return t;

 if ((temp = FatherNode(t->GetLeft(), p)) != NULL)

  return temp;

 else

  return FatherNode(t->GetRight(), p);

}

//查值的节点

template <class T>

BinTreeNode<T>* BinTree<T>::FindData(BinTreeNode<T>* t, const T& item)

{

 BinTreeNode<T> *p, *q;

 if (t == NULL)

 {

  if (t == root)

   cout << "此树为空";

  return NULL;

 }

 if (t->GetData() == item)

 {

  cout << "已找到此结点";

  return t;

 }

 if ((p = FindData(t->GetLeft(), item)) != NULL)//查询左子树

  return p;

 else

  return q = FindData(t->GetRight(), item);//查询右子树

}

//删除子树(包括根节点)

template<class T>

void BinTree<T>::DeleteBinTree(BinTreeNode<T>* t)

{

 if (t != NULL)

 {

  DeleteBinTree(t->GetLeft());//删除左子树

  DeleteBinTree(t->GetRight());//删除右子树

  delete t;//删除根节点

 }

}

#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: