二叉排序树的删除:
http://blog.csdn.net/arcsinsin/article/details/10238505
http://www.cnblogs.com/Lvsi/archive/2011/06/13/2079280.html
# include<iostream>
# include<queue>
using namespace std;
typedef struct BinSearchTree
{
int data;
struct BinSearchTree *left;
struct BinSearchTree *right;
}btree;
//二叉排序树插入
void insert(btree *&root,btree *s)
{
if(root==NULL)
root=s;
else if(root->data==s->data)
{
return;
}
else if(root->data>s->data)
{
insert(root->left,s);
}
else
insert(root->right,s);
}
void creat(btree *&b)
{
b=NULL;
btree *s;
while(1)
{
int x;
cin>>x;
if(x<0)
break;
s=(btree *)malloc(sizeof(btree));
s->data=x;
s->left=NULL;
s->right=NULL;
insert(b,s);
}
}
btree* Search(btree *root,int data)
{
if(root==NULL)
return NULL;
if(root->data==data)
return root;
else if(root->data>data)
Search(root->left,data);
else
Search(root->right,data);
}
void Delnode(btree *&root,int data)
{
btree *s=Search(root,data);
if(s==NULL)
return ;
if(s->left!=NULL) // 有左子树
{
btree *r=s->left;
btree *pre=s->left;
while(r->right) // 找左子树中最右边(最大)的节点
{
pre=r;
r=r->right;
}
s->data=r->data; // 用左子树中最右边的节点的值覆盖要删除的节点
if(pre!=r) // s 的左子树有右节点
{
pre->right=r->left;
}
else // s 的左子树无 右节点
{
s->left=r->left;
}
free(r); // 释放节点r
}
else // 只有右子树
{
btree *p=s;
s=s->right;
free(p);
p=NULL;
}
}
void print(btree *root) // 层序遍历输出
{
queue<btree *> q1;
btree *p;
if(root==NULL)
return ;
q1.push(root);
while(!q1.empty())
{
p=q1.front();
q1.pop();
cout<<p->data<<" ";
if(p->left!=NULL)
q1.push(p->left);
if(p->right!=NULL)
q1.push(p->right);
}
}