二叉查找树
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
树的节点定义如下:
#define keytype int
typedef struct BTreeNode
{
struct BTreeNode* left;
struct BTreeNode* right;
struct BTreeNode* parent;
keytype value;
}node,*pnode;
二叉查找树的插入
pnode TreeInsert(pnode T,keytype k)
{
pnode z = (pnode)malloc(sizeof(node));
z->left = NULL;
z->right = NULL;
z->parent = NULL;
z->value = k;
pnode x = T;
pnode y = NULL;
while(x!=NULL)
{
y = x;
if(k < x->value)
x = x->left;
else
x = x->right;
}
z->parent = y;
if(y==NULL)
{
T = z;
}
else
{
if(k < y->value)
y->left = z;
else
y->right = z;
}
return T;
}
二叉查找树的删除
二叉树节点的删除要考虑的三种情况:
1.如果要删除的节点没有子女,则直接删除
2.如果要删除的节点只有一个子女,将其子女链接到父节点
3.如果要删除的节点有两个子女,则删除其后继节点
pnode TreeMinimum(pnode x)
{
while(x->left != NULL)
x = x->left;
return x;
}
pnode TreeSuccessor(pnode x)
{
if(x->right != NULL)
return TreeMinimum(x);
pnode y = x->parent;
while(y!=NULL && x==y->right)
{
x = y;
y = y->parent;
}
return y;
}
pnode TreeDelete(pnode T,pnode z)
{
pnode x,y;
if(z->left==NULL || z->right==NULL)
y = z;
else
y = TreeSuccessor(z);
if(y->left != NULL)
x = y->left;
else
x = y->right;
if(x != NULL)
x->parent = y->parent;
if(y->parent == NULL)
T = x;
else if(y == y->parent->left)
y->parent->left = x;
else
y->parent->right = x;
if(y != z)
z->value = y->value;
return y;
}