建树
树节点的存储方式与普通的二叉树相似,用结构体存储,其中一个 int 变量存储数据,两个指针指向左右儿子。
读入一个新数据,从根节点开始寻找,大于当前节点则继续寻找右子树,右子树为空则直接插入,小于当前节点则继续寻找左子树,左子树为空则直接插入。
注:
初始数据要求随机数,为了产生真正意义上的“随机数”,使用时间作为随机数种子。
查找
从根节点开始寻找,大于当前节点则转向右子树,小于当前节点则转向左子树。直到找到等于的节点。如果转到了空节点,则说明这个数并不在这棵二叉查找树上。
插入
插入的过程与查找相似。从头开始寻找,如果在树上找到了,则说明树上已有此节点,不需再插入。如果没有在树上,那么会走到一个空节点,此时直接将新节点插入空节点处即可。注意与上一级节点的衔接。
首先是寻找要删除的节点。这一步与寻找的过程相似。
当找到要删除的节点后,会出现以下情况:
(1)左右子树为空
直接删除即可
(2)左子树为空
直接将右子树移到待删除节点处即可。
(3)右子树为空
直接将左子树移到待删除节点处即可。
(4)左右子树均不为空
先将左子树整体插入到右子树中,再将右子树移到待删除节点处。
遍历与二分查找
二叉查找树的遍历与普通二叉树相同,可以通过递归实现。先递归左子树,然后输出根节点,最后递归右子树。这样便得到一个有序的序列。
对于这个有序的序列中的任意元素,都可以通过二分查找找到他们的具体位置。二分查找可以通过一个循环实现,对于每一层循环,先比较目标元素与当前区间中心元素进行比较,目标元素大于中间元素时,说明在右区间内,否则在左区间内。直到区间锁定到一个元素,即目标元素。
CODE:
- #include<iostream>
- #include<cstdlib>
- #include<cstdio>
- #include<cstring>
- #include<vector>
- #include<time.h>
- #define N 100
- using namespace std;
- typedef struct Tree
- {
- int data;
- Tree *ls,*rs;
- };
- Tree *head;
- int sorr[N];
- int nn=0;
- void build(Tree *T,Tree *now);
- void printt(Tree *now,int sorr[]);
- void fi(Tree *now,int ii);
- void find();
- void insee(Tree *now,Tree *ii);
- void insert();
- void inn(Tree *now,Tree *ii);
- void del(Tree *now,int ii);
- void delet();
- int binSearch(const int *Array,int start,int end,int key);
- void find_2(int sorr[]);
- int main()
- {
- srand((unsigned)time(NULL));
- head=NULL;
- for (int i=0;i<10;i++)
- {
- int num=rand()%100+1;
- Tree *T;
- T=new Tree;
- T->data=num;
- T->ls=T->rs=NULL;
- build(T,head);
- }
- cout<<"======PRI======"<<endl;
- printt(head,sorr);
- find();
- insert();
- nn=0;cout<<"---AFTER INSERT---"<<endl;
- printt(head,sorr);
- delet();
- nn=0;cout<<"---AFTER DELETE---"<<endl;
- printt(head,sorr);
- find_2(sorr);
- cout<<"======FINAL======"<<endl;
- printt(head,sorr);
- }
- void build(Tree *T,Tree *now)
- {
- if (head==NULL)
- {
- head=T;
- return;
- }
- if (now->data>T->data)
- {
- if (now->ls!=NULL)
- {
- build(T,now->ls);
- }
- else
- now->ls=T;
- }
- else if (now->data<T->data)
- {
- if (now->rs!=NULL)
- {
- build(T,now->rs);
- }
- else
- now->rs=T;
- }
- }
- void printt(Tree *now,int sorr[])
- {
- if (head->data==0)
- {
- cout<<"NULL!"<<endl;
- return;
- }
- if (now->ls!=NULL)
- printt(now->ls,sorr);
- if (now->data!=0)
- {
- cout<<now->data<<" ";
- //if (now->ls!=NULL) cout<<now->ls->data<<" ";
- //if (now->rs!=NULL) cout<<now->rs->data;
- cout<<endl;
- }
- sorr[nn]=now->data;
- nn++;
- if (now->rs!=NULL)
- printt(now->rs,sorr);
- }
- void fi(Tree *now,int ii)
- {
- if (now->data==ii)
- {
- cout<<"GET IT!"<<endl;
- return;
- }
- if (now->rs ==NULL && now->ls==NULL)
- {
- cout<<"NO!"<<endl;
- return;
- }
- if (now->data>ii) fi(now->ls,ii);
- else fi(now->rs,ii);
- return;
- }
- void find()
- {
- cout<<"======FIND======"<<endl;
- int n;
- cin>>n;
- while (n!=-1)
- {
- fi(head,n);
- cin>>n;
- }
- //cout<<now->data<<endl;
- }
- void insee(Tree *now,Tree *ii)
- {
- if (now->data==ii->data)
- {
- cout<<"HAVE HAD IT!"<<endl;
- return;
- }
- if (now->data>ii->data)
- {
- if (now->ls==NULL)
- now->ls=ii;
- else insee(now->ls,ii);
- }
- else if (now->data<ii->data)
- {
- if (now->rs==NULL)
- now->rs=ii;
- else insee(now->rs,ii);
- }
- return;
- }
- void insert()
- {
- int n;
- cout<<"=====INSERT====="<<endl;
- cin>>n;
- while (n!=-1)
- {
- Tree *T1;
- T1=new Tree;
- T1->data=n;
- T1->ls=T1->rs=NULL;
- insee(head,T1);
- cin>>n;
- }
- }
- void inn(Tree *now,Tree *ii)
- {
- if (now->data>ii->data)
- {
- if (now->ls==NULL)
- now->ls=ii;
- else inn(now->ls,ii);
- }
- else if (now->data<ii->data)
- {
- if (now->rs==NULL)
- now->rs=ii;
- else inn(now->rs,ii);
- }
- return;
- }
- void del(Tree *now,int ii)
- {
- //cout<<now->data<<endl;
- if (now->data==ii)
- {
- if (now->ls==NULL && now->rs==NULL)
- memset(now,sizeof(Tree));
- else if (now->ls==NULL)
- *now=*(now->rs);
- else if (now->rs==NULL)
- *now=*(now->ls);
- else if (now->ls!=NULL)
- {
- inn(now->rs,now->ls);
- *now=*(now->rs);
- }
- cout<<"OK"<<endl;
- return;
- }
- if (now->rs ==NULL && now->ls==NULL)
- {
- cout<<"NO!"<<endl;
- return;
- }
- if (now->data>ii) del(now->ls,ii);
- else del(now->rs,ii);
- return;
- }
- void delet()
- {
- cout<<"======DELETE======="<<endl;
- int n;
- cin>>n;
- while (n!=-1)
- {
- del(head,n);
- nn=0;cout<<"...NOW..."<<endl;
- printt(head,sorr);
- cout<<endl;
- cin>>n;
- }
- return;
- }
- int binSearch(const int *Array,int key)
- {
- int left,right;
- int mid;
- left=start;
- right=end;
- while(left<=right)
- {
- mid=(left+right)/2;
- if(key==Array[mid]) return mid;
- else if(key<Array[mid]) right=mid-1;
- else if(key>Array[mid]) left=mid+1;
- }
- return -1;
- }
- void find_2(int sorr[])
- {
- cout<<"=====FIND_2===="<<endl;
- int n;
- cin>>n;
- while (n!=-1)
- {
- cout<<binSearch(sorr,nn,n)<<endl;
- cin>>n;
- }
- return;
- }