数据结构之二叉树_BinTree

来源:互联网 发布:淘宝发表论文靠谱吗 编辑:程序博客网 时间:2024/06/03 18:22
#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
0 0
原创粉丝点击