首页 > 代码库 > 二叉搜索树 C++代码实现
二叉搜索树 C++代码实现
暂未发现什么bug,如果发现请指出。
#include<iostream>using namespace std;//定义二叉搜索树的结点struct Node{ int data; Node *lc,*rc,*parent;};//中序遍历二叉搜索树void show(Node *now){ if(now==NULL) return; show(now->lc); cout<<now->data<<endl; show(now->rc);}//将值为val的结点插入到二叉搜索树中//?为什么要传指向根结点指针的指针,而不是直接传根结点的指针。因为根结点的指针可能为空,这里需要开辟内存。Node* insert(Node **rt,int val){ Node *now=*rt;//用now指针在树上移动 Node *par=NULL;//记录now指针的父亲 while(now!=NULL) { par=now; if(val<now->data)//如果val小于当前结点的值说明应该插到左子树中 now=now->lc; else now=now->rc; //否则插入到右子树中 } Node *newnode=new Node;//开辟新结点 newnode->data=http://www.mamicode.com/val; newnode->lc=newnode->rc=NULL; if(par==NULL)//当这是一棵空树的时候 { newnode->parent=NULL; *rt=newnode;//直接通过指针修改根结点 } else { if(val<par->data) par->lc=newnode; else par->rc=newnode; newnode->parent=par; } return newnode;}//在以now为根结点的树上,寻找值为val的结点Node* search(Node *now,int val){ while(now!=NULL&&now->data!=val) { if(val<now->data) now=now->lc; else now=now->rc; } return now;}//在以now为根结点的树上,寻找最大、最小值Node* maximun(Node *now){ while(now->rc!=NULL) { now=now->rc; } return now;}Node* minimun(Node *now){ while(now->lc!=NULL) now=now->lc; return now;}//寻找now结点的前继、后继//寻找前继:如果now的左子树非空,则返回左子树的最大值结点。否则如果now是父亲的左孩子则不断向上直到now不再是父亲的左孩子,返回父结点。Node* predecessor(Node *now){ if(now->lc!=NULL) return maximun(now->lc); Node *par=now->parent; while(par!=NULL&&now==par->lc) { now=par; par=par->parent; } return par;}Node* successor(Node *now){ if(now->rc!=NULL) return minimun(now->rc); Node *par=now->parent; while(par!=NULL&&now==par->rc) { now=par; par=par->parent; } return par;}//对于一棵以T为根结点的树,用以v为根结点的子树取代以u为根结点的子树,完成u的父亲与v之间的绑定void transplant(Node **T,Node *u,Node *v){ if(u->parent==NULL) (*T)=v; else if(u==u->parent->lc) u->parent->lc=v; else if(u==u->parent->rc) u->parent->rc=v; if(v!=NULL) v->parent=u->parent;}//删除给定结点void erase(Node **T,Node *now){ Node *temp=now; if(now->lc==NULL) { transplant(T,now,now->rc); } else if(now->rc==NULL) { transplant(T,now,now->lc); } else { Node* nextnode=successor(now); if(nextnode!=now->rc) { transplant(T,nextnode,nextnode->rc); nextnode->rc=now->rc; now->rc->parent=nextnode; } transplant(T,now,nextnode); nextnode->lc=now->lc; now->lc->parent=nextnode; } delete temp;}int main(){ Node *root=NULL; while(1) { cout<<"1.插入结点"<<endl; cout<<"2.删除结点"<<endl; cout<<"3.中序遍历"<<endl; cout<<"4.查询"<<endl; cout<<"5.查询根"<<endl; int p; cin>>p; if(p==1) { cout<<"输入待插元素值:"<<endl; int t; cin>>t; insert(&root,t); cout<<"插入成功!"<<endl; } else if(p==2) { cout<<"输入待删元素值:"<<endl; int t; cin>>t; Node *q=search(root,t); if(q==NULL)cout<<"该值不存在!"<<endl; else { erase(&root,q); cout<<"删除成功!"<<endl; } } else if(p==3) { cout<<"======"<<endl; show(root); cout<<"======"<<endl; } else if(p==4) { cout<<"输入待查询元素值:"<<endl; int t; cin>>t; Node *q=search(root,t); if(q==NULL) cout<<"该值不存在!"<<endl; else { Node *a=predecessor(q),*b=successor(q); if(a!=NULL) cout<<"前继:"<<a->data<<endl; if(b!=NULL) cout<<"后继:"<<b->data<<endl; } } else if(p==5) { if(root==NULL) cout<<"根为空!"<<endl; else cout<<"根:"<<root->data<<endl; } } return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。