二叉查找树
二叉查找树满足以下条件:
1.左子树上的所有节点值均小于根节点的值;
2.右子树上的所有节点值均大于根节点的值;
3.左右子树也满足上述条件。
二叉查找树的查找操作
这个操作需要返回指向树T中具有关键字X的节点的指针。若节点T中的关键字是X则返回T,若T中的关键字不是X,则对左子树或者右子树递归调用查找操作,若不存在这样的节点则返回NULL。
实现代码如下:
Tree Find(ElemType X,Tree T)
{
if(T==NULL)
return NULL;
if(X > T->data)
return Find(T->right);
else if(X < T->data)
return Find(T->left);
else
return T;
}
若是在二叉查找树中寻找最小值或是最大值时只需要从根节点向左子树或者右子树递归就可以。
二叉查找树的插入操作
为了将X插入到树T中,可以像Find那样沿着树查找,如果找到X则什么也不做,如果找不到则将X插入到遍历的路径上的最后一点上。
实现代码如下:
Tree Insert(ElemType X,Tree T)
{
if(T == NULL)
{
T = malloc(sizeof(Tree));
T->data = X;
T->left = NULL;
T->right = NULL;
}
esle if(X < T->data)
{
T->left = Insert(X,T->left);
}
else if(X > T->data)
{
T->right = Insert(X,T->right);
}
return T;
}
二叉查找树的删除操作
如果节点是一片树叶,那么它可以被立即删除。如果及诶但有一个儿子,则该节点可以在其父节点调整指针绕过该节点后被删除,所删除的节点现在已不再引用,而该节点只有在指向它的指针已被省去的情况下才能被去掉。
复杂的情况是处理具有两个儿子的节点。一般的删除的策略是用其右子树的最小数据代替该节点的数据并递归删除那个节点。因为右子树中的最小节点不可能有左儿子,所以第二次删除要容易。
6
/ \
2 8
/ \
1 5
/
3
\
4
例如:要删除图中的节点2时,首先用右子树的最小节点 3 代替 2 ,并递归调用函数删除节点 3 。
Tree Delete(ElemType X,Tree T)
{
Tree tmpCell;
if(T == NULL)
Error("X not found");
else if(X < T->data)
{
T->left = Delete(X,T->left);
}
else if(X > T->data)
T->right = Delete(X,T->right);
else if(T->left && T->right) //two children
{
tmpCell = FindMin(T->right);
T->data = tmpCell->data;
T->right = Delete(tmpCell->data,T->right);
}
else // One or zero child
{
tmpCell = T;
if(T->left == NULL)
T = T->right;
else if(T->right == NULL)
T = T->left;
free(tmpCell);
}
return T;
}