#ifndef BINTREE_H_INCLUDED
#define BINTREE_H_INCLUDED
#include<iostream>
#include <queue>
using std::cin;
using std::cout;
using std::endl;
#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) {}
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; }//返回右指针引用
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; }//返回跟节点指针
};
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>
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>::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>::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>::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();
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());//再看右孩子
}
}
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>::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;
}
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);//查询右子树
}
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;//删除根节点
}
template<class T>
void BinTree<T>::DeleteBinTree(BinTreeNode<T>* t)
{
if (t != NULL)
{
DeleteBinTree(t->GetLeft());//删除左子树
DeleteBinTree(t->GetRight());//删除右子树
delete t;//删除根节点
}
}
#endif