#include<iostream.h> typedef char dataType; class Node{ public: dataType data; Node* lchild; Node* rchild; Node(){ lchild=NULL; rchild=NULL; } Node(dataType data){ this->data=data; lchild=NULL; rchild=NULL; } ~Node(){} }; class StackNode{ public: dataType data; Node* lchild; Node* rchild; Node* add; }; class Tree{ private: Node* r; int n; public: Node* root; Tree(){ root=NULL,n=0;} ~Tree(){} int countNum(){return n;} void display();//遞歸實現中序遍歷 bool insertNode(dataType data);//插入結點 bool delNode(char data);//刪除結點 Node* findNode(dataType data); Node* findNode(dataType data,Node** pre); Node* findNode(dataType data,Node* &pre); void midDisplay();//非遞歸實現中序遍歷 }; //遞歸到非遞歸:自己構造一個類似遞歸中的棧(遞歸棧) void Tree::midDisplay() { StackNode stack[100];//棧中要存儲訪問過的結點(結點數據和結點地址) int i=-1; Node* p=root; if(p!=NULL){ //stack[++i]=p->data;//入棧 // Node* temp=p->lchild; while(i>-1||p!=NULL){ while(p!=NULL){ stack[++i].data=p->data;//數據入棧 stack[i].add=p;//地址入棧 p=p->lchild; } p=stack[i].add;//p指向棧頂 cout<<stack[i--].data;//出棧並輸出 p=p->rchild; } } else{cout<<"空樹!"<<endl;} }; void Tree::display()//中序遍歷 { Node* p=root; if(p!=NULL) { Tree ltree; ltree.root=p->lchild; ltree.display(); cout<<p->data; Tree rtree; rtree.root=p->rchild; rtree.display(); } } bool Tree::delNode(dataType data){ Node* pre=NULL; Node* p=findNode(data,&pre); if(p!=NULL){ if(p->rchild==NULL&&p->lchild==NULL) { if(p==pre->rchild){pre->rchild=NULL;} else{pre->lchild=NULL;} delete(p); } else if(p->rchild==NULL&&p->lchild!=NULL) { if(p==pre->rchild){pre->rchild=p->lchild;} else{pre->lchild=p->lchild;} delete(p); } else if(p->lchild==NULL&&p->rchild!=NULL) { if(p==pre->rchild){pre->rchild=p->rchild;p=NULL;} else{pre->lchild=p->rchild;p=NULL;} delete(p); } else /*if(p->lchild!=NULL&&p->rchild!=NULL)*///左右子樹都有 { Node* lp=p->lchild; Node* fpre; fpre=lp; while(lp->rchild!=NULL){ fpre=lp; lp=lp->rchild; } p->data=lp->data; if(lp->rchild==NULL&&lp->lchild==NULL) { if(lp==fpre){p->lchild=NULL;} else{ if(lp==fpre->rchild){fpre->rchild=NULL;} else{fpre->lchild=NULL;} } delete(lp); } else if(lp->rchild==NULL&&lp->lchild!=NULL) { if(lp==fpre->rchild){fpre->rchild=p->lchild;} else{fpre->lchild=lp->lchild;} delete(lp); } else /*if(p->lchild==NULL&&p->rchild!=NULL)*/ { if(lp==fpre->rchild){fpre->rchild=lp->rchild;lp=NULL;} else{fpre->lchild=lp->rchild;lp=NULL;} delete(lp); } //delete(lp); } n--; return true; } return false; } Node* Tree::findNode(dataType data,Node** pre){//返回NULL說明沒有找到,pre爲找到的結點的父節點 Node* p=root; *pre=NULL; while(p!=NULL){ if(data==p->data){return p;} if(data>p->data){(*pre)=p;p=p->rchild;} else{(*pre)=p;p=p->lchild;} } return NULL; } Node* Tree::findNode(dataType data,Node* &pre){//返回NULL說明沒有找到,pre爲找到的結點的父節點 Node* p=root; pre=NULL; while(p!=NULL){ if(data==p->data){return p;} if(data>p->data){pre=p;p=p->rchild;} else{pre=p;p=p->lchild;} } return NULL; } Node* Tree::findNode(dataType data){ Node* p=root; while(p!=NULL){ if(p->data==data){return p;} if(data<p->data){p=p->lchild;} else{p=p->rchild;} } return NULL; } /*bool Tree::insertNode(dataType data){ Node* p=root; Node* pre; if(p==NULL){Node* node=new Node(data);root=node;n++;return true;} while(p!=NULL){ if(data==p->data){return false;} if(data>p->data){pre=p;p=p->rchild;} else{pre=p;p=p->lchild;} } if(p==NULL){ Node* node=new Node(data); if(data>pre->data){pre->rchild=node;} else{pre->lchild=node;} n++; return true;} return false; }*/ bool Tree::insertNode(dataType data){ Node* p=root; if(p==NULL){Node* node=new Node(data);root=node;n++;return true;}//確保pre不爲空,若沒有這句,插入第一個結點時,會得到一個爲空的pre指針,下面的if語句會出錯 Node* pre=NULL; if(findNode(data,&pre)==NULL) { Node* node=new Node(data); if(data>pre->data){pre->rchild=node;} else{pre->lchild=node;} n++; return true; } return false; } void main() { Tree tree; cout<<tree.countNum()<<endl; tree.insertNode('D'); tree.insertNode( 'B' ); tree.insertNode( 'C' ); tree.insertNode( 'E' ); for(int i=0;i<26;i++){tree.insertNode('A'+i);} tree.display(); cout<<endl; cout<<tree.countNum()<<endl; Node* pre=NULL; cout<<tree.findNode('A',&pre)->data<<endl;//二重指針傳參取指針的地址做參數 if(pre!=NULL){ cout<<"前一個數:"<<pre->data<<endl; } cout<<tree.findNode('A',pre)->data<<endl;// if(pre!=NULL){ cout<<"前一個數:"<<pre->data<<endl; } cout<<tree.findNode('C')->data<<endl; tree.delNode('D'); if(tree.findNode('D')==NULL){cout<<"沒有該數!"<<endl;} cout<<tree.countNum()<<endl; tree.display(); cout<<endl; tree.midDisplay(); cout<<endl; }
二叉排序樹的構造,插入,遍歷,查找,刪除
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.