转载:https://blog.csdn.net/xiexiexiexieqing/article/details/117468490
插入:
void in(struct TREE*tree,struct DATA data)
{
struct node*pmove=tree->root; //pmove先等于搜索树的根节点 pmove 在前面探路
struct node*pnode=NULL; //pnode 紧跟在 pmove 的后面
struct node*newnode=createnode(data); // 调用 方法
while(pmove) //先 通过 插入规则 探路
{
pnode=pmove;
if(newnode->data.a > pmove->data.a)
pmove=pmove->right;
else
pmove=pmove->left;
}
if(tree->root==NULL) //后 分类讨论 在合适的位置插入 新节点(newnode)
tree->root=newnode;
else
{
if(newnode->data.a > pnode->data.a)
pnode->right=newnode;
else
pnode->left=newnode;
}
}
删除:
分为2种情况:
1.删除节点的子节点都存在
就直接去找 它的左边最大 或者 右边最小 用 两者之一 在释放 这个最值节点
2.删除节点的子节点最多存在一个
直接让删除节点的父节点 连接 删除节点的子节点 释放删除节点
//删除
void del(struct node*root,int data)
{
struct node*pnode=root;
struct node*pnodeparent;
while(pnode!=NULL && pnode->data!=data) //先找到这个节点
{
pnodeparent=pnode; //父节点必须在子节点上面
if(data>pnode->data)
pnode=pnode->right;
else
pnode=pnode->left;
}
if(pnode==NULL) //当pnode为空 意思是把这颗树都找遍了 还是没有
{
printf("没有"); //所以 返回时 要有一个提示
return ;
}
if(pnode->left!=NULL&&pnode->right!=NULL) //删除节点的子节点都存在
{
struct node*pmove=pnode->left; //找左边的最大节点
struct node*pmoveparent;
while(pmove->right!=NULL)
{
pmoveparent=pmove;
pmove=pmove->right;
}
pnode->data=pmove->data; //把这个最大节点的值赋给 删除节点
pnode=pmove; //现在相当于删除这个 最大节点
pnodeparent=pmoveparent;
}
struct node*snode; //定义一个节点
if(pnode->left!=NULL) //获取 最大节点的子节点
snode=pnode->left;
else //不存在子节点就赋值NULL
snode=NULL;
if(pnodeparent==NULL) //如果父节点为空那么就是 空树 还是把获取到的节点给它
pnodeparent=snode;
else if(pnodeparent->right==pnode)
pnodeparent->right=snode;
else
pnodeparent->left=snode;
free(pnode);
}