📄 binarytree.h
字号:
#ifndef BINARY_TREE_CLASS
#define BINARY_TREE_CLASS
#include "BinTreeNode.h"
#include "Stack.h"
#include "Queue.h"
#include "Student.h"
#include <fstream.h>
template <class T>
class BinaryTree
{
public:
BinaryTree():root(NULL){}
void Initial(T value);
void initial(T value);
// virtual ~BinaryTree();
// void DeleteTree(BinTreeNode<T> *);
void Insert(const T & x,BinTreeNode<T> * & ptr);
void insert(const T & x,BinTreeNode<T> * & ptr);
void Construct();
BinTreeNode<T> *Search(const T & item,BinTreeNode<T> *t);
void Remove(const T & item,BinTreeNode<T> *&t);
void PreOrder();
void PreOrder(BinTreeNode<T> *current);
void PreOrdering();
void InOrder();
void InOrder(BinTreeNode<T> *current);
void InOrdering();
void PostOrder();
void PostOrder(BinTreeNode<T> *current);
void PostOrdering();
bool LevelScan(BinTreeNode<T> *current,const T & item);
void PrintTree(BinTreeNode<T>*,int level);
int CountNode(BinTreeNode<T> *t);
int CountD1Node(BinTreeNode<T> *t);
int CountD2Node(BinTreeNode<T> *t);
void CountLeaf(BinTreeNode<T> *t,int & count);
int Depth(BinTreeNode<T> *t);
void Min(BinTreeNode<T> *t,T & item);
void Max(BinTreeNode<T> *t,T & item);
BinTreeNode<T> *Min(BinTreeNode<T> *t);
BinTreeNode<T> *Max(BinTreeNode<T> *t);
BinTreeNode<T> *Copy(BinTreeNode<T> *t);
bool Equal(BinTreeNode<T> *a,BinTreeNode<T> *b);
void Exchange(BinTreeNode<T> *t);
BinTreeNode<T> * & Root(){return root;}
private:
BinTreeNode<T> *root;
T RefValue;
};
template <class T>
void BinaryTree<T>::Initial(T value)
{
T x;
root=NULL;
RefValue=value;
cout<<"\t";
cin>>x;
while(x!=RefValue)
{
cout<<"\t";
Insert(x,root);
cin>>x;
}
}
template <class T>
void BinaryTree<T>::initial(T value)
{
T x;
RefValue=value;
cout<<"\t";
cin>>x;
while(x!=RefValue)
{
cout<<"\t";
Insert(x,root);
cin>>x;
}
}
template <class T>
void BinaryTree<T>::Construct()
{
ifstream in;
in.open("Student.dat",ios::in||ios::nocreate);
T value;
while(in>>value)
{
Insert(value,root);
}
}
/*template <class T>
BinaryTree<T>::~BinaryTree()
{
DeleteTree(root);
}*/
/*template <class T>
void BinaryTree<T>::DeleteTree(BinTreeNode<T> *t)
{
if(t!=NULL)
{
DeleteTree(t->left);
DeleteTree(t->right);
delete t;
}
}*/
template <class T>
void BinaryTree<T>::Insert(const T & x,BinTreeNode<T> * & ptr)
{
if(ptr==NULL)
{
ptr=new BinTreeNode<T>(x);
if(ptr==NULL)
{
cout<<"Invalid space!"<<endl;
exit(1);
}
}
else if(x<ptr->data) Insert(x,ptr->left);
else if(x>ptr->data) Insert(x,ptr->right);
}
template <class T>
void BinaryTree<T>::insert(const T & x,BinTreeNode<T> * & ptr)
{
if(ptr==NULL)
{
ptr=new BinTreeNode<T>(x);
if(ptr==NULL)
{
cout<<"Invalid space!"<<endl;
exit(1);
}
}
else if(x<=ptr->data) Insert(x,ptr->left);
else if(x>=ptr->data) Insert(x,ptr->right);
}
template <class T>
BinTreeNode<T>* BinaryTree<T>::Search(const T &item,BinTreeNode<T> *t)
{
if(t==NULL)
return NULL;
else if(item<t->data) Search(item,t->left);
else if(item>t->data) Search(item,t->right);
return t;
}
template <class T>
void BinaryTree<T>::Remove(const T &item,BinTreeNode<T> * &t)
{
BinTreeNode<T> *temp;
if(t!=NULL)
if(item<t->data) Remove(item,t->left);
else if(item>t->data) Remove(item,t->right);
else if(t->left!=NULL&&t->right!=NULL)
{
temp=Min(t->right);
t->data=temp->data;
Remove(t->data,t->right);
}
else
{
temp=t;
if(t->left==NULL) t=t->right;
else if(t->right==NULL) t=t->left;
}
}
template <class T>
void BinaryTree<T>::InOrder()
{
InOrder(root);
}
template <class T>
void BinaryTree<T>::InOrder(BinTreeNode<T> *current)
{
if(current!=NULL)
{
InOrder(current->left);
cout<<current->data;
InOrder(current->right);
}
}
template <class T>
void BinaryTree<T>::InOrdering()
{
BinTreeNode<T> *p;
Stack<BinTreeNode<T>* >S;
p=root;
ofstream out;
out.open("Student.dat",ios::out);
while(p!=NULL||!S.IsEmpty())
{
if(p!=NULL)
{
S.Push(p);
p=p->left;
}
else
{
p=S.Pop();
out<<p->data;
p=p->right;
}
}
out<<"\t"<<CountNode(root);
out.close();
}
template <class T>
void BinaryTree<T>::PreOrder()
{
PreOrder(root);
}
template <class T>
void BinaryTree<T>::PreOrder(BinTreeNode<T> *current)
{
if(current!=NULL)
{
cout<<"\t"<<current->data<<endl;
PreOrder(current->left);
PreOrder(current->right);
}
}
template <class T>
void BinaryTree<T>::PreOrdering()
{
BinTreeNode<T> *p;
Stack<BinTreeNode<T>* >S1;
Stack<BinTreeNode<T>* >S2;
S1.Push(root);
while(!S1.IsEmpty()&&root!=NULL)
{
p=S1.GetTop();
S1.Pop();
S2.Push(p);
if(p->right!=NULL) S1.Push(p->right);
if(p->left!=NULL) S1.Push(p->left);
}
while(!S2.IsEmpty())
{
insert(S2.Pop()->data,root);
}
}
template <class T>
void BinaryTree<T>::PostOrder()
{
PostOrder(root);
}
template <class T>
void BinaryTree<T>::PostOrder(BinTreeNode<T> *current)
{
if(current!=NULL)
{
PostOrder(current->left);
PostOrder(current->right);
cout<<current->data;
}
}
template <class T>
void BinaryTree<T>::PostOrdering()
{
Stack<BinTreeNode<T>* >S1;
Stack<int> S2;
BinTreeNode<T> *p;
p=root;
while(p!=NULL||!S1.IsEmpty())
{
while(p!=NULL)
{
S1.Push(p);
p=p->left;
S2.Push(0);
}
while(!S2.IsEmpty()&&S2.GetTop()==1)
{
cout<<S1.Pop()->data;
S2.Pop();
}
if(!S2.IsEmpty())
{
S2.Pop();
S2.Push(1);
p=S1.GetTop()->right;
}
}
}
template <class T>
bool BinaryTree<T>::LevelScan(BinTreeNode<T> *current,const T & item)
{
Queue<BinTreeNode<T> *> Q;
BinTreeNode<T> *p;
Q.EnQueue(current);
while(Q.DeQueue(p)&&p!=NULL)
{
if(item==p->data)
{
cout<<"\tno\tname\tsex\tscore"<<endl;
cout<<p->data;
return 1;
break;
}
if(p->left!=NULL)
Q.EnQueue(p->left);
if(p->right!=NULL)
Q.EnQueue(p->right);
}
return 0;
}
template <class T>
int BinaryTree<T>::CountNode(BinTreeNode<T> *t)
{
if(t==NULL)
return 0;
if(t->left==NULL&&t->right==NULL)
return 1;
else
return 1+CountNode(t->left)+CountNode(t->right);
}
template <class T>
void BinaryTree<T>::CountLeaf(BinTreeNode<T> *t,int & count)
{
if(t!=NULL)
{
CountLeaf(t->left,count);
CountLeaf(t->right,count);
if(t->left==NULL&&t->right==NULL)
count++;
}
}
template <class T>
int BinaryTree<T>::CountD1Node(BinTreeNode<T> *t)
{
if(t==NULL)
return 0;
else if(t->left==NULL&&t->right!=NULL)
return 1+CountD1Node(t->right);
else if(t->right==NULL&&t->left!=NULL)
return 1+CountD1Node(t->left);
else
return CountD1Node(t->left)+CountD1Node(t->right);
}
template <class T>
int BinaryTree<T>::CountD2Node(BinTreeNode<T> *t)
{
if(t==NULL)
return 0;
int num=CountD2Node(t->left)+CountD2Node(t->right);
if(t->left!=NULL&&t->right!=NULL)
return 1+num;
else
return num;
}
template <class T>
int BinaryTree<T>::Depth(BinTreeNode<T> *t)
{
int depthLeft,depthRight,depthval;
if(t==NULL)
depthval=-1;
else
{
depthLeft=Depth(t->left);
depthRight=Depth(t->right);
depthval=1+(depthLeft>depthRight?depthLeft:depthRight);
}
return depthval;
}
template <class T>
void BinaryTree<T>::Min(BinTreeNode<T> *t,T &item)
{
if(t!=NULL)
{
Max(t->left,item);
Max(t->right,item);
if(t->data<=item)
item=t->data;
}
}
template <class T>
void BinaryTree<T>::Max(BinTreeNode<T> *t,T &item)
{
if(t!=NULL)
{
Max(t->left,item);
Max(t->right,item);
if(t->data>=item)
item=t->data;
}
}
template <class T>
BinTreeNode<T>* BinaryTree<T>::Min(BinTreeNode<T> * t)
{
BinTreeNode<T> *temp;
while(t!=NULL)
{
temp=t;
t=t->left;
}
return temp;
}
template <class T>
BinTreeNode<T>* BinaryTree<T>::Max(BinTreeNode<T> *t)
{
BinTreeNode<T> *temp;
while(t!=NULL)
{
temp=t;
t=t->right;
}
}
template <class T>
BinTreeNode<T>* BinaryTree<T>::Copy(BinTreeNode<T> *t)
{
if(t==NULL)
return NULL;
BinTreeNode<T> *temp=new BinTreeNode<T>(t->data);
Copy(t->left);
Copy(t->right);
return temp;
}
template <class T>
bool BinaryTree<T>::Equal(BinTreeNode<T> *a,BinTreeNode<T> *b)
{
if(a==NULL&&b==NULL)
return true;
else if(a!=NULL&&b!=NULL&&a->data==b->data
&&Equal(a->left,b->left)
&&Equal(a->right,b->right))
return true;
return false;
}
template <class T>
void BinaryTree<T>::Exchange(BinTreeNode<T> *t)
{
BinTreeNode<T> *temp;
if(t!=NULL)
{
temp=t->left;
t->left=t->right;
t->right=temp;
Exchange(t->left);
Exchange(t->right);
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -