概念:左节点比根小,右节点比根大。
struct Node{
int val;
Node * left;
Node * right;
};
Node * insert(Node * p,int x){//插入一个节点
if(p==NULL){
Node * q=new Node;
q->val=x;
q->left=NULL;
q->right=NULL;
return q;
}
else{
if(x<p->val)p->left=insert(p->left,x);
else p->right=insert(p->right,x);
return p;
}
}
bool find(Node * p,int x){
if(p==NULL)return false;
if(p->val==x)return true;
if(x<p->val)return find(p->left,x);
else return find(p->right,x);
}
Node * remove(Node * p,int x){
if(p==NULL)return NULL;
else if(x<p->val)p->left=remove(p->left,x);
else if(x>p->val)p->right=remove(p->right,x);
else if(p->left==NULL){//等于并且左子树为空
Node * q=p->right;
delete p;
return q;//递归操作,直接给就行了
}
else if(p->right==NULL){//没有右子树
Node * q=p->left;
delete p;
return q;
}
else{//左右子树都存在,把左子树最大的节点拿出来,即最右节点
Node * q;
for(q=p->left;q->right->right!=NULL;q=q->right);
Node * r=q->right;
q->right=r->left;
r->left=p->left;
r->right=p->right;
delete p;
return r;
}
return p;
}
STL流的set是一个二叉搜索树结构,具有去重功能,输出时从小到大排序。
int main(){
set<int> sets;
set<int>::iterator it;
for(int i=1;i<=5;i++){
sets.insert(i);
}
for(int i=2;i<=6;i++){
it=sets.find(i);
cout << (it==sets.end()?0:1) << endl;
}
cout << "!!" << endl;
for(int i=3;i<=5;i++){
sets.erase(i);
}
for(int i=1;i<=5;i++){
it=sets.find(i);
cout << (it==sets.end()?0:1) << endl;
}
return 0;
}