using namespace::std;
typedef int ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode {
ElementType Data;
BinTree Left;
BinTree Right;
};
BinTree Insert(BinTree BST, ElementType X)
{
if (BST)
{
if (X<BST->Data)
return Insert(BST->Left, X);//错在没有及时直接修正左子树及右子树
if (X>BST->Data)
return Insert(BST->Right, X);
}
else
{
BinTree T = (BinTree)malloc(sizeof(TNode));
T->Left = T->Right = NULL;
T->Data = X;
return T;
}
return BST;
}
Position Find(BinTree BST, ElementType X)
{
if (BST)
{
if (X<BST->Data)
return Find(BST->Left, X);
if (X>BST->Data)
return Find(BST->Right, X);
if (X == BST->Data)
return BST;
}
return NULL;
}
Position FindMin(BinTree BST)
{
if (!BST)
return NULL;
if (BST->Left)
{
return FindMin(BST->Left);
}
else
return BST;
}
Position FindMax(BinTree BST)
{
if (!BST)
return NULL;
if (BST->Right)
{
return FindMax(BST->Right);
}
else
return BST;
}
BinTree Delete(BinTree BST, ElementType X)
{
BinTree T = BST;
BinTree Pre = T;
while (T)
{
if (X<T->Data)
{
Pre = T;
T = T->Left;
}
if (X>T->Data)
{
Pre = T;
T = T->Right;
}
if (X == T->Data)//想问题过于简单,子树不止有其后的两个结点,还可能会有其它子树
{
if (!T->Left && !T->Right)
{
if (X<Pre->Data)
{
Pre->Left = NULL;
free(T);
}
if (X>Pre->Data)
{
Pre->Right = NULL;
free(T);
}
if (X == Pre->Data)
return NULL;
}
if (T->Left && !T->Right)
{
T->Data = T->Left->Data;
BinTree Post = T->Left;
T->Left = NULL;
free(Post);
}
if (!T->Left&&T->Right)
{
T->Data = T->Right->Data;
BinTree Post = T->Right;
T->Right = NULL;
free(Post);
}
if (T->Left&&T->Right)
{
T->Data = T->Left->Data;
BinTree Post = T->Left;
T->Left = NULL;
free(Post);
}
return BST;
}
}
printf("Not Found");
return BST;
}
这是我做的数据结构的二叉搜索树的操作集的题目,FIND的部分都是成功的,Insert的问题出在没有更新Left或Right.而Delete的问题出在没有考虑清楚,如果左右两结点都有的子树问题,以下是正确的代码
BinTree Insert(BinTree BST, ElementType X)
{
if (BST)
{
if (X<BST->Data)
BST->Left=Insert(BST->Left, X);//更新
if (X>BST->Data)
BST->Right=Insert(BST->Right, X);//更新
}
else
{
BinTree T = (BinTree)malloc(sizeof(struct TNode));
T->Left = T->Right = NULL;
T->Data = X;
return T;
}
return BST;
}
Position Find(BinTree BST, ElementType X)
{
if (BST)
{
if (X<BST->Data)
return Find(BST->Left, X);
if (X>BST->Data)
return Find(BST->Right, X);
if (X == BST->Data)
return BST;
}
return NULL;
}
Position FindMin(BinTree BST)
{
if (!BST)
return NULL;
if (BST->Left)
{
return FindMin(BST->Left);
}
else
return BST;
}
Position FindMax(BinTree BST)
{
if (!BST)
return NULL;
if (BST->Right)
{
return FindMax(BST->Right);
}
else
return BST;
}
BinTree Delete(BinTree BST, ElementType X)
{
Position Tmp;
if (!BST)
printf("Not Found\n");
else
{
if (X < BST->Data)
BST->Left = Delete(BST->Left, X);
else if (X > BST->Data)
BST->Right = Delete(BST->Right, X);
else
{
if (BST->Left&&BST->Right)
{
Tmp = FindMax(BST->Left);//寻找左子树中最大的元素,让其代替当前的BST,并删除找到的左子树最大元素
BST->Data = Tmp->Data;
BST->Left = Delete(BST->Left, BST->Data);
}
else
{
Tmp = BST;
if (!BST->Right)//没有右结点或两个结点都没有
BST = BST->Left;
else
BST = BST->Right;//没有左结点
free(Tmp);
}
}
}
return BST;
}