//BinaryTree.h #ifndef BTNODE_H #define BTNODE_H #include <iostream> using namespace std; template<class T> class BinaryTree; template<class T> class BTNode //二叉树的结点类 { public: BTNode(); BTNode(const T& e); T GetVal() const; //返回结点的值 private: T val; //存放结点的值 BTNode<T>* lchild; //指向左孩子 BTNode<T>* rchild; //指向右孩子 BTNode<T>* parent; //指向双亲 friend bool operator==<T>(const BTNode<T>& lhs,const BTNode<T>& rhs); friend bool operator!=<T>(const BTNode<T>& lhs,const BTNode<T>& rhs); friend ostream& operator<< <T>(ostream& os,const BTNode<T>& rhs); template<class T> friend class BinaryTree; //vc++6编译失败,把private去掉可通过编译 }; template<class T> class BinaryTree //二叉树类 { public: BinaryTree(); ~BinaryTree(); bool IsEmpty() const; //判断二叉树是否为空 int Depth(BTNode<T>* bt) const; //返回p指向结点的深度 T GetValue(const BTNode<T>& e) const; //返回结点e的值 void SetValue(BTNode<T>& e,const T& val); //设置结点e的值 BTNode<T>* GetRoot() const; //返回根结点指针 bool FindNode(BTNode<T>* bt,const T& val,BTNode<T>*& ret) const; //返回指向值为val的结点的指针 bool GetParent(const BTNode<T>& e,BTNode<T>& ret) const; //返回结点e的双亲结点 bool GetLChild(const BTNode<T>& e,BTNode<T>& ret) const; //返回结点e的左孩子结点 bool GetRChild(const BTNode<T>& e,BTNode<T>& ret) const; //返回结点e的右孩子结点 bool GetLSibling(const BTNode<T>& e,BTNode<T>& ret) const; //返回结点e的左兄弟结点 bool GetRSibling(const BTNode<T>& e,BTNode<T>& ret) const; //返回结点e的右兄弟结点 /*LR指示插入二叉树t在p所指结点的左子树还是右子树 LR==true为左子树,LR==false则为右子树,二叉树t的 右子树为空,且p所指结点的原来左子树或右子树成为t 的新的右子树*/ void InsertChild(BTNode<T>* p,bool LR,BinaryTree<T>* bt); //插入二叉树在p所指结点的左子树(LR==true)或右子树(LR==false) void DeleteChild(BTNode<T>* p,bool LR); //删除p所指结点的左子树或右子树 void PreOrderTraverse(BTNode<T>* bt,bool (*p)(BTNode<T>*)) const; //前序遍历以bt所指结点为根结点的二叉树并应用p所指函数 void InOrderTraverse(BTNode<T>* bt,bool (*p)(BTNode<T>*)) const; //中序遍历以bt所指结点为根结点二叉树并应用p所指函数 void PostOrderTraverse(BTNode<T>* bt,bool (*p)(BTNode<T>*)) const; //后序遍历以bt所指结点为根结点二叉树并应用p所指函数 void LevelOrderTraverse(BTNode<T>* bt,bool (*p)(BTNode<T>*)) const; //层序遍历以bt所指结点为根结点二叉树并应用p所指函数 private: void InitBiTree(); //初始化二叉树 void CreateBiTree(BTNode<T>*& bt); //建立二叉树 void DestroyBiTree(); //销毁二叉树 void CreateParent(); //设置指向双亲的结点 BTNode<T>* root; //指向二叉树根结点 }; #include "BinaryTree.cpp" #endif //BinaryTree.cpp #include <iostream> #include "BinaryTree.h" #include "MyQueue.h" template<class T> BTNode<T>::BTNode() { lchild=NULL; rchild=NULL; parent=NULL; } template<class T> BTNode<T>::BTNode(const T& e) { val=e; lchild=NULL; rchild=NULL; parent=NULL; } template<class T> T BTNode<T>::GetVal() const { return val; } template<class T> bool operator==(const BTNode<T>& lhs,const BTNode<T>& rhs) { if( lhs.val==rhs.val) return true; return false; } template<class T> bool operator!=(const BTNode<T>& lhs,const BTNode<T>& rhs) { return !(lhs==rhs); } template<class T> ostream& operator<<(ostream& os,const BTNode<T>& rhs) { os<<rhs.val; return os; } template<class T> BinaryTree<T>::BinaryTree() { InitBiTree(); } template<class T> BinaryTree<T>::~BinaryTree() { DestroyBiTree(); } template<class T> void BinaryTree<T>::InitBiTree() { root=NULL; cout<<"按先序次序输入各结点值,输入#表示空结点"<<endl; CreateBiTree(root); CreateParent(); } template<class T> void BinaryTree<T>::DestroyBiTree() { if(root!=NULL) { DeleteChild(root,true); //删除左子树 DeleteChild(root,false); //删除右子树 delete root; //删除根结点 root=NULL; } } template<class T> void BinaryTree<T>::CreateBiTree(BTNode<T>*& bt) //构造二叉树,按先序次序输入二叉树中结点的值,输入#表示空结点 { T val; cin>>val; if(val=='#') bt=NULL; else { bt=new BTNode<T>(val); CreateBiTree(bt->lchild); CreateBiTree(bt->rchild); } } template<class T> void BinaryTree<T>::CreateParent() { if(root!=NULL) { MyQueue<BTNode<T>*> q; root->parent=NULL; q.EnQueue(root); while(!q.QueueEmpty()) { BTNode<T>* temp; q.DeQueue(temp); if(temp->lchild) { temp->lchild->parent=temp; q.EnQueue(temp->lchild); } if(temp->rchild) { temp->rchild->parent=temp; q.EnQueue(temp->rchild); } } } } template<class T> bool BinaryTree<T>::IsEmpty() const { if(root==NULL) return true; return false; } template<class T> int BinaryTree<T>::Depth(BTNode<T>* bt) const { if(bt==NULL) return 0; else { int dep1=Depth(bt->lchild); int dep2=Depth(bt->rchild); if(dep1>dep2) return dep1+1; else return dep2+1; } } template<class T> BTNode<T>* BinaryTree<T>::GetRoot() const { return root; } template<class T> T BinaryTree<T>::GetValue(const BTNode<T>& e) const { return e.val; } template<class T> void BinaryTree<T>::SetValue(BTNode<T>& e,const T& val) { e.val=val; } template<class T> bool BinaryTree<T>::FindNode(BTNode<T>* bt,const T& val,BTNode<T>*& ret) const //返回指向值为val的结点的指针,采用先序查找 { if(bt!=NULL) { if(bt->GetVal()==val) { ret=bt; return true; } else { if(bt->lchild) { if(FindNode(bt->lchild,val,ret)) return true; } if(bt->rchild) { if(FindNode(bt->rchild,val,ret)) return true; } } return false; } return false; } template<class T> bool BinaryTree<T>::GetParent(const BTNode<T>& e,BTNode<T>& ret) const { if(e.parent) { ret=*(e.parent); return true; } return false; } template<class T> bool BinaryTree<T>::GetLChild(const BTNode<T>& e,BTNode<T>& ret) const { if(e.lchild) { ret=*(e.lchild); return true; } return false; } template<class T> bool BinaryTree<T>::GetRChild(const BTNode<T>& e,BTNode<T>& ret) const { if(e.rchild) { ret=*(e.rchild); return true; } return false; } template<class T> bool BinaryTree<T>::GetLSibling(const BTNode<T>& e,BTNode<T>& ret) const { if(e.parent) { if(e.parent->lchild!=&e) //判断是否等于自身 { ret=*(e.parent->lchild); return true; } } return false; } template<class T> bool BinaryTree<T>::GetRSibling(const BTNode<T>& e,BTNode<T>& ret) const { if(e.parent) { if(e.parent->rchild!=&e) //判断是否等于自身 { ret=*(e.parent->rchild); return true; } } return false; } template<class T> void BinaryTree<T>::InsertChild(BTNode<T>* p,bool LR,BinaryTree<T>* bt) //插入二叉树在p所指结点的左子树(LR==true)或右子树(LR==false) { if(p->lchild==NULL && p->rchild==NULL) //仅支持在叶子结点插入 { if(LR==true) { p->lchild=bt->GetRoot(); } else { p->rchild=bt->GetRoot(); } } } template<class T> bool DeleteNode(BTNode<T>* bt) //用作后序遍历删除结点 { if(bt!=NULL) { delete bt; return true; } return false; } template<class T> void BinaryTree<T>::DeleteChild(BTNode<T>* p,bool LR) //删除p所指结点的左子树或右子树 { if(LR==true) //删除左子树 { if(p->lchild) { BTNode<T>* temp=p->lchild; p->lchild=NULL; PostOrderTraverse(temp,DeleteNode<T>); } } else //删除右子树 { if(p->rchild) { BTNode<T>* temp=p->rchild; p->rchild=NULL; PostOrderTraverse(temp,DeleteNode<T>); } } } template<class T> void BinaryTree<T>::PreOrderTraverse(BTNode<T>* bt,bool (*p)(BTNode<T>*)) const //前序遍历以bt所指结点为根结点的二叉树并应用p所指函数 { if(bt!=NULL) { if(p(bt)) { PreOrderTraverse(bt->lchild,p); PreOrderTraverse(bt->rchild,p); } } } template<class T> void BinaryTree<T>::InOrderTraverse(BTNode<T>* bt,bool (*p)(BTNode<T>*)) const //中序遍历以bt所指结点为根结点的二叉树并应用p所指函数 { if(bt!=NULL) { InOrderTraverse(bt->lchild,p); if(p(bt)) { InOrderTraverse(bt->rchild,p); } } } template<class T> void BinaryTree<T>::PostOrderTraverse(BTNode<T>* bt,bool (*p)(BTNode<T>*)) const //后序遍历以bt所指结点为根结点的二叉树并应用p所指函数 { if(bt!=NULL) { PostOrderTraverse(bt->lchild,p); PostOrderTraverse(bt->rchild,p); p(bt); } } template<class T> void BinaryTree<T>::LevelOrderTraverse(BTNode<T>* bt,bool (*p)(BTNode<T>*)) const //层序遍历以bt所指结点为根结点的二叉树并应用p所指函数 { if(bt!=NULL) { MyQueue<BTNode<T>*> q; q.EnQueue(bt); while(!q.QueueEmpty()) { BTNode<T>* temp; q.DeQueue(temp); p(temp); if(temp->lchild) { q.EnQueue(temp->lchild); } if(temp->rchild) { q.EnQueue(temp->rchild); } } } } //test.cpp #include <iostream> #include "BinaryTree.h" using namespace std; template<class T> bool visit(BTNode<T>* s) { cout<<*s; return true; } int main() { BinaryTree<char> bt; cout<<"二叉树1:"<<endl; // cout<<bt.IsEmpty()<<endl; cout<<"深度:"<<bt.Depth(bt.GetRoot())<<endl; cout<<"先序遍历:"; bt.PreOrderTraverse(bt.GetRoot(),visit<char>); cout<<"/n中序遍历:"; bt.InOrderTraverse(bt.GetRoot(),visit<char>); cout<<"/n后序遍历:"; bt.PostOrderTraverse(bt.GetRoot(),visit<char>); cout<<"/n层序遍历:"; bt.LevelOrderTraverse(bt.GetRoot(),visit<char>); cout<<endl; cout<<"二叉树2:"<<endl; BinaryTree<char> bt1; cout<<"深度:"<<bt1.Depth(bt.GetRoot())<<endl; cout<<"先序遍历:"; bt.PreOrderTraverse(bt1.GetRoot(),visit<char>); cout<<"/n中序遍历:"; bt.InOrderTraverse(bt1.GetRoot(),visit<char>); cout<<"/n后序遍历:"; bt.PostOrderTraverse(bt1.GetRoot(),visit<char>); cout<<"/n层序遍历:"; bt.LevelOrderTraverse(bt1.GetRoot(),visit<char>); BTNode<char>* ret; if(bt.FindNode(bt.GetRoot(),'4',ret)) //bt1插入在bt里值为4的结点的右子树 { bt.InsertChild(ret,false,&bt1); } cout<<"/n二叉树2插入在二叉树1结点值为4的右子树:"<<endl; cout<<"深度:"<<bt.Depth(bt.GetRoot())<<endl; cout<<"先序遍历:"; bt.PreOrderTraverse(bt.GetRoot(),visit<char>); cout<<"/n中序遍历:"; bt.InOrderTraverse(bt.GetRoot(),visit<char>); cout<<"/n后序遍历:"; bt.PostOrderTraverse(bt.GetRoot(),visit<char>); cout<<"/n层序遍历:"; bt.LevelOrderTraverse(bt.GetRoot(),visit<char>); cout<<endl; if(bt.FindNode(bt.GetRoot(),'2',ret)) { BTNode<char> ret1; if(bt.GetLChild(*ret,ret1)) { cout<<*ret<<"的左子树是:"<<ret1<<endl; } else { cout<<*ret<<"没有左子树"<<endl; } if(bt.GetRChild(*ret,ret1)) { cout<<*ret<<"的右子树是:"<<ret1<<endl; } else { cout<<*ret<<"没有右子树"<<endl; } if(bt.GetParent(*ret,ret1)) { cout<<*ret<<"的双亲:"<<ret1<<endl; } else { cout<<*ret<<"没有双亲"<<endl; } if(bt.GetRSibling(*ret,ret1)) { cout<<*ret<<"的右兄弟是:"<<ret1<<endl; } else { cout<<*ret<<"没有右兄弟"<<endl; } if(bt.GetLSibling(*ret,ret1)) { cout<<*ret<<"的左兄弟是:"<<ret1<<endl; } else { cout<<*ret<<"没有左兄弟"<<endl; } } return 0; } 注意不要把BinaryTree.cpp加入到工程中了. 测试结果