#include <iostream>
using namespace std;
template<class T>
class BinTreeNode{
private:
BinTreeNode<T> *left,*right;
T data;
public:
BinTreeNode(BinTreeNode<T> *lptr,BinTreeNode *rptr,T& item){
left = lptr;
right = rptr;
data = item;
}
~BinTreeNode(){}
BinTreeNode<T>* GetLeft(){
return left;
}
void SetLeft(BinTreeNode<T>* L){
left = L;
}
BinTreeNode<T>* GetRight(){
return right;
}
void SetRight(BinTreeNode<T>* R){
right = R;
}
T& GetData(){
return data;
}
void SetDate(T& item){
data = item;
}
};
template<class T>
class BinTree{
private:
BinTreeNode<T>* root;
public:
BinTree(BinTreeNode<T>* item = NULL){
root = item;
}
~BinTree();
BinTreeNode<T>* GetRoot(){
return root;
}
void SetRoot(BinTreeNode<T>* t){
root = t;
}
bool IsEmpty(){
return root == NULL;
}
//在以t为根节点的子树中搜索p节点的父节点
BinTreeNode<T>* Father(BinTreeNode<T>* t,BinTreeNode<T>* p);
//在以t为根节点的子树中搜索值为item的节点
BinTreeNode<T>* Find(BinTreeNode<T>* t,T item);
void DelSubTree(BinTreeNode<T>* t);
void DelTree(BinTreeNode<T>* t);
void PreOrder(BinTreeNode<T>* t);
void InOrder(BinTreeNode<T>* t);
void PostOrder(BinTreeNode<T>* t);
/* void LevelOrder(BinTreeNode<T>* t);
void NorcePreOrder(BinTreeNode<T>* t);
void NorceInOrder(BinTreeNode<T>* t);
void NorcePostOrder(BinTreeNode<T>* t);
层次遍历用队列,其他利用堆栈-0-
**************************************/
BinTreeNode<T>* CreateBinTree(T StopFlag);
};
template<class T>
BinTreeNode<T>* BinTree<T> :: Father(BinTreeNode<T>* t,BinTreeNode<T>* p){
BinTreeNode<T>* q;
if(t == NULL){
cout<<"根节点为空!"<<endl;
return NULL;
}
if(p == NULL){
cout<<"搜索节点为空!"<<endl;
return NULL;
}
if(t->GetLeft() == p||t->GetRight() == p){
return t;
}
if((q = Father(t->GetLeft(),p))!=NULL){
return q;
}
else{
return Father(t->GetRight(),p);
}
}
template<class T>
BinTreeNode<T>* BinTree<T> :: Find(BinTreeNode<T>* t,T item){
BinTreeNode<T>* q;
if(t == NULL){
cout<<"根节点为空!"<<endl;
return NULL;
}
if(t->GetData() == item){
return t;
}
if((q = Find(t->GetLeft(),item))!=NULL){
return q;
}
else{
return Find(t->GetRight(),item);
}
}
template<class T>
void BinTree<T> :: DelTree(BinTreeNode<T>* t){
if(t == NULL){
return ;
}
DelTree(t->GetLeft());
DelTree(t->GetRight());
delete t;
return ;
}
template<class T>
void BinTree<T> :: DelSubTree(BinTreeNode<T>* t){
if(t == NULL){
return ;
}
if(t == root ){
DelTree(t);
root = NULL;
return ;
}
BinTreeNode<T>* q;
q = Father(root,t);
if(q){
if(q->GetLeft()==t){
q->SetLeft(NULL);
}
if(q->GetRight()==t){
q->SetRight(NULL);
}
}
DelTree(t);
}
template<class T>
void BinTree<T> :: PreOrder(BinTreeNode<T> *t){
if(t!=NULL){
cout<<t->GetData()<<endl;
PreOrder(t->GetLeft());
PreOrder(t->GetRight());
}
}
template<class T>
void BinTree<T> :: InOrder(BinTreeNode<T>* t){
if(t!=NULL){
InOrder(t->GetLeft());
cout<<t->GetData()<<endl;
InOrder(t->GetRight());
}
}
template<class T>
void BinTree<T> :: PostOrder(BinTreeNode<T>* t){
if(t!=NULL){
PostOrder(t->GetLeft());
PostOrder(t->GetRight());
cout<<t->GetData()<<endl;
}
}
template<class T>
BinTreeNode<T>* BinTree<T> :: CreateBinTree(T StopFlag){
BinTreeNode<T> *t,*t1,*t2;
T item;
cin>>item;
if(item == StopFlag){
t = NULL;
return t;
}
else{
if(!(t = new BinTreeNode<T>(NULL,NULL,item))){
cout<<"创建节点失败,创建二叉树失败!"<<endl;
}
t1 = CreateBinTree(StopFlag);
t->SetLeft(t1);
t2 = CreateBinTree(StopFlag);
t->SetRight(t2);
return t;
}
}
int main(){
BinTree<int> *p = new BinTree<int>;
BinTreeNode<int> *t;
BinTreeNode<int>* x;
t = p->CreateBinTree(0);
p->SetRoot(t);
p->PreOrder(t);
cout<<"XXXXXXXXX"<<endl;
p->InOrder(t);
cout<<"XXXXXXXXX"<<endl;
p->PostOrder(t);
cout<<"XXXXXXXXX"<<endl;
x = p->Find(t,2);
p->DelSubTree(x);
p->PreOrder(t);
cout<<"XXXXXXXXX"<<endl;
p->InOrder(t);
cout<<"XXXXXXXXX"<<endl;
p->PostOrder(t);
return 0;
}
【面试准备】数据结构-二叉树
最新推荐文章于 2023-09-19 23:38:39 发布