您的位置:首页 > 其它

二叉排序树的构造,插入,遍历,查找,删除

2014-03-05 22:12 656 查看
#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;

}


本文出自 “学习党” 博客,请务必保留此出处http://lyunfan.blog.51cto.com/6649420/1368885
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: