中序遍历下,返回某一结点的后继结点
1)如果结点x有右子结点,则其后继结点为右子树中最小结点。
2)如果结点x没有右子树,且x有一个后继y,则y是x的最低祖先结点且y的左儿子也是x的祖先。
TREE_SUCCESSOR(x)
if right[x] != NIL
return TREE_MINIMUM(right[x])
y=p[x]
while y!=NIL and x=right[y] //如果x=left[y],那么x的后继就是y,跳出while循环,直接返回y即可
do x <-- y
y <-- p[y]
return y
============================================*/
struct node * tree_successor(struct node *T)
{
if(T->right!=NULL)
return tree_minimum(T->right);
struct node *y=T->parent;
while(y!=NULL && T == y->right){
T=y;
y=y->parent;
}
return y;
}
/*===========================================
插入操作
思路:从根节点一路往下寻找插入位置,用指针x跟踪这条寻找路径,并用指针y指向x的父结点
TREE_INSERT(T,z)
y=NIL
x=root[T]
while x!= NIL //直到x为空,这个空位置即为需要插入的位置
do y<-- x
if key[z]<key[x]
then x <-- left[x]
else x <-- right[x]
p[z]=y
if y=NIL
then root[T]=z //树T为空时的情况
else if key[z] < key[y]
then left[y]=z //小于y的插在左边,大于的插在右边
else right[y]=z
============================================*/
void tree_insert(tree *PT,struct node *z)
{
if(*PT==NULL){//树为空,则将z作为根结点返回
*PT=z;
return;
}
struct node *y=NULL;
struct node *x=*PT;
while(x!=NULL){
y=x;
if(z->key < x->key)
x=x->left;
else
x=x->right;
}
z->parent=y;
if(z->key < y->key)
y->left=z;
else
y->right=z;
}
/*===============================================
删除操作
删除操作分为三类情况:
1)若要删除的节点z没有子女,则只需修改z的父节点的该子女为NIL即可
2)若要删除的节点z只有一个子女,则只需将z的这个子女与z的父节点连接起来即可
3)若要删除的节点z有两个子女,则需要先删除z的后继y,再用y的内容替换z的内容。
TREE_DELETE(T,z)
if left[z]=NIL || right[z]=NIL //把要删除的节点先保存在y中
then y <-- z
else y <-- TREE_SUCCESSOR(z)
if left[y]!=NIL //将y的非空子女存放在x中
then X <-- left[y]
else x <-- right[y]
if x!=NIL
then p[x]=p[y] //将要删除节点的子女连接到要删除节点的父节点上
if p[y]=NIL //如果要删除的节点为根节点
then root[T] <-- x
else if y=left[p[y]]//
then left[p[y]] <-- x
else right[p[y]] <-- x
if y!=z //第三种情况,需要用y的内容替换z的内容
then key[z] <-- key[y]
copy y's other data to z
return y
==============================================*/
struct node * tree_delete(tree *PT,struct node *z)
{
struct node *delnode,*sonnode;
if(z->left==NULL || z->right == NULL)//有一个子女或无子女,则要删除的结点结尾z本身
delnode=z;
else //有两个子女,则要删除的结点为z的后继结点
delnode=tree_successor(z);
if(delnode->left!=NULL)
sonnode=delnode->left;
else
sonnode=delnode->right;
if(sonnode!=NULL)
sonnode->parent=delnode->parent;
if(delnode->parent==NULL)
*PT=sonnode;
else if(delnode->parent->left==delnode)
delnode->parent->left=sonnode;
else
delnode->parent->right=sonnode;
if(delnode!=z){
z->key=delnode->key;
strcpy(z->data,delnode->data);
}
return delnode;
}