#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; }
二叉排序树的构造,插入,遍历,查找,删除
原创
©著作权归作者所有:来自51CTO博客作者lyunfan的原创作品,请联系作者获取转载授权,否则将追究法律责任
![](https://ucenter.51cto.com/images/noavatar_middle.gif)
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
二叉排序树创建,查找,删除
代码public class Main { public static void main(String[] args) {
java 子节点 父节点 二叉排序树 -
二叉排序树的查找与删除
构造一颗二叉排序树的目的,其实并不是为了排序,而是为了提高查找和插入删除关键字的速度。
二叉排序树的查找与删除 结点 二叉排序树 子树