二叉排序树(查找树)

二叉查找树:二叉查找树,也称二叉搜索树,或二叉排序树。其定义也比较简单,要么是一颗空树,要么就是具有如下性质的树:

1 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

2 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

3 任意节点的左、右子树也分别为二叉查找树;

4 没有键值相等的节点。

查找树核心查找:searchBET

相等于二分查找法

bool ErChaTree::serachBET(treeNode* root,int val, treeNode *preRoot, treeNode** end)
{
	if (!root)
	{
		*end = preRoot;
		return false;
	}
	else if (root->val == val)
	{
		*end = root;
		return true;
	}
	else if (root->val < val)
	{
		return serachBET(root->prChild, val, root, end);
	}
	else
	{
		return serachBET(root->plChild, val, root, end);
	}
	return false;
}

end:找到时,等于当前结点,没有找到时等于父节点

插入操作也很简单

bool ErChaTree::insertNode(int val)
{
	treeNode* end = NULL;
	if (!serachBET(m_Root, val, NULL, &end))
	{
		treeNode* newNode = new treeNode;
		newNode->val = val;

		if (!end)
		{
			m_Root = newNode;
		}
		else if (end->val < val)
		{
			end->prChild = newNode;
		}
		else
		{
			end->plChild = newNode;
		}

		return true;
	}
	else
	{
		return false;
	}
}

当该值不存在时,end等于当前值root结点。

删除操作


bool ErChaTree::deleteBETNode(treeNode** root, int val)
{
	if (!*root)
	{
		return false;
	}
	else if ((*root)->val == val)
	{
		deleteNode(root);
	}
	else if ((*root)->val < val)
	{
		return deleteBETNode(&(*root)->prChild,val);
	}
	else
	{
		return deleteBETNode(&(*root)->plChild, val);
	}
	return false;
}

bool ErChaTree::deleteNode(treeNode ** node)
{
	treeNode* pCur;
	treeNode* pNext;
	pCur = *node;

	if (pCur->prChild == NULL)
	{
		*node = pCur->plChild;
		delete pCur;
	}
	else if (pCur->plChild == NULL)
	{
		*node = pCur->prChild;
		delete pCur;
	}
	else
	{
		pNext = pCur->plChild;
		while (pNext->prChild)
		{
			pCur = pNext;
			pNext = pNext->prChild;
		}
		(*node)->val = pNext->val;
		if (pCur != *node)
		{
			pCur->prChild = pNext->plChild;
		}
		else
		{
			pCur->plChild = pNext->plChild;
		}
		delete(pNext);
	}

	return true;
}

建树容易拆树难

删除结点的时候要考虑到4种情况:

1:删除结点左右子树均为空

2:删除结点左子树为空

3:删除结点右子树为空

4:删除结点左右子树均不为空

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值