解题代码
BinTree Insert(BinTree BST, ElementType X) {
if (!BST) {
BST = (BinTree)malloc(sizeof(struct TNode));
BST->Data = X;
BST->Left = BST->Right = NULL;
return BST;
}
if (X < BST->Data) BST->Left=Insert(BST->Left, X);
else if (X > BST->Data) BST->Right = Insert(BST->Right, X);
return BST;
}
BinTree Delete(BinTree BST, ElementType X) {
BinTree temp;
if (!BST) {
printf("Not Found\n");
return BST;
}
if (X < BST->Data) BST->Left=Delete(BST->Left, X);
else if (X > BST->Data) BST->Right = Delete(BST->Right, X);
else {
if (BST->Right&&BST->Left) {
temp = FindMin(BST->Right);
BST->Data = temp->Data;
BST->Right = Delete(BST->Right, BST->Data);
}
else {
temp = BST;
if (!BST->Right) BST = BST->Left;
else if (!BST->Left) BST = BST->Right;
free(temp);
}
}
return BST;
}
Position Find(BinTree BST, ElementType X) {
if (!BST) return NULL;
if (X > BST->Data) Find(BST->Right, X);
else if (X < BST->Data) Find(BST->Left, X);
else return BST;
}
Position FindMin(BinTree BST) {
if (!BST) return NULL;
while (BST->Left) {
BST = BST->Left;
}
return BST;
}
Position FindMax(BinTree BST) {
if (!BST) return NULL;
while (BST->Right) {
BST = BST->Right;
}
return BST;
}
测试结果
问题整理
1.delete和insert都是用递归实现。
2.delete对于删除点操作的逻辑分成是否拥有两个子节点,无子节点的情况不单独讨论,故产生了这段代码:
if (!BST->Right) BST = BST->Left;
else if (!BST->Left) BST = BST->Right;