//实际删除的是待删节点的直接后继,下面是删除直接后继的过程,(待删结点至多只有一个儿子, 有两个会转化为0个或1个右结点)
待删结点是根结点 */
if (NULL == parent)
{
*tree = child;
}
else
{
/*待删结点是父亲结点的左儿子*/
if (parent->lchild == p)
{
parent->lchild = child;
}
else
{
parent->rchild = child;
}
//将实际删除的节点的key值赋给原先要删除的节点
if (p != q)
{
q->key = p->key;
}
}
free(p);
return 0;
}
//二叉排序树查找
BSTNode* SearchBST(BSTree *T,KeyType key)
{ //在二叉排序树T上查找关键字为key的结点,成功时返回该结点位置,否则返回NUll
if(T==NULL) //递归的终结条件
return NULL; //T为空,查找失败;
if(key==T->key)
//成功,返回找到的结点位置
{
printf("Got it!");
return T;
}
if(key<T->key)
return SearchBST(T->lchild,key);
else
return SearchBST(T->rchild,key);//继续在右子树中查找
} //SearchBST
int main()
{
int n;
BSTree *B=NULL;
printf("Input number to initialize a BSTree:");
while(1)
{
scanf("%d",&n);
if(n==0) break;
InsertNode(&B, n);
}
dispTree(B);
printf("PreOrder:");
preOrder(B);
printf("\n");
printf("Search a node:");
scanf("%d",&n);
SearchBST(B,n);
printf("\n");
printf("Delete a node:");
scanf("%d",&n);
delNode(&B,n);
dispTree(B);
printf("PreOrder:");
preOrder(B);
printf("\n");
return 1;
}
运行结果: