包含了二叉搜索树的插入,删除,查找,中序遍历,找最大值最小值的操作,代码中有注释。
/*Keep on going Never give up*/
//#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
using namespace std;
struct Node{
int data;
Node *l,*r,*parent;
};
//由大到小排序(中序遍历二叉树)
void sortx(Node *rt){
if(rt==NULL) return;
sortx(rt->l);
cout<<rt->data<<endl;
sortx(rt->r);
}
//插入结点
Node* insert(Node* rt,int val){
if(!rt){ //若原树为空,生成并返回一个结点的二叉搜索树
rt=new Node;
rt->data=val;
rt->r=rt->l=NULL;
} else{ //开始找要插入元素的位置
if(val<rt->data) rt->l=insert(rt->l,val); //递归左子树
else if(val>rt->data) rt->r=insert(rt->r,val); //递归右子树
}
return rt;
}
//找出val的结点
Node* ifind(Node *rt,int val){
while (rt!=NULL&&rt->data!=val){
if(val<rt->data) rt=rt->l;
else rt=rt->r;
}
return rt;
}
//找出最大值
Node* imax(Node *rt){
while (rt->r!=NULL) rt=rt->r;
return rt;
}
//找出最小值
Node* imin(Node *rt){
while (rt->l!=NULL) rt=rt->l;
return rt;
}
//删除给定结点
Node* del(Node *rt,int val){
Node *temp=new Node;
if(!rt) cout<<"元素未找到"<<endl;
else{
if(val<rt->data) rt->l=del(rt->l,val); /* 从左子树递归删除 */
else if(val>rt->data) rt->r=del(rt->r,val);/* 从右子树递归删除 */
else{
if(rt->l&&rt->r){ //分情况删除
temp=imin(rt->r);
rt->data=temp->data;
rt->r=del(rt->r,rt->data);
} else{
temp=rt;
if(!rt->l) rt=rt->r;
else rt=rt->l;
}
free(temp);
}
}
return rt;
}
int main()
{
int a[10]={5,6,8,2,3,7,4,1,5,77};
Node *root=NULL;
for(int i=0;i<10;i++) root=insert(root,a[i]);
root=del(root,7);
sortx(root);
return 0;
}