概念:左节点比根小,右节点比根大。
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; }