二叉树操作集的错误及修正

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值