数据结构笔记-二叉排序树

引入思想:既能满足类似折半查找的查找效率,又能保证插入和删除的效率。

概念

二叉排序树(Binary Sort Tree) 或则是一棵空树;或则是具有下列性质的二叉树:

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

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

3. 它的左、右子树也分别为二叉排序树;

查询操作

代码如下:
bool CSortTree::Search( const int nData, BiTNode*& pFindNode )
{
	if( NULL == m_pBiTree )
	{
		return false;
	}

	pFindNode = m_pBiTree;
	bool bFind = false;

	while( NULL != pFindNode)
	{
		if( nData == pFindNode->nData )
		{
			bFind = true;
			break;
		}
		else if( (nData < pFindNode->nData) &&
			(NULL != pFindNode->pLChild) )
		{
			pFindNode = pFindNode->pLChild;
			continue;
		}
		else if( (nData > pFindNode->nData) &&
			(NULL != pFindNode->pRChild) )
		{
			pFindNode = pFindNode->pRChild;
			continue;
		}
		else
		{
			break;
		}
	}

	return bFind;
}

插入操作

代码如下:
bool CSortTree::InSert( const int nData )
{
	BiTNode* pFindNode = NULL;
	BiTNode* pNewNode = NULL;

	if( !Search( nData, pFindNode) )
	{
		pNewNode = new BiTNode;

		pNewNode->nData = nData;
		pNewNode->pLChild = NULL;
		pNewNode->pRChild = NULL;

		if( NULL == pFindNode )
		{
			m_pBiTree = pNewNode;
		}
		else
		{
			if( nData < pFindNode->nData )
			{
				pFindNode->pLChild = pNewNode;
			}
			else
			{
				pFindNode->pRChild = pNewNode;
			}
		}
		return true;
	}
	return false;
}

删除操作

代码如下:
bool CSortTree::Delete( const int nData )
{
	if( NULL == m_pBiTree )
	{
		return false;
	}

	BiTNode* pParentNode = m_pBiTree;
	BiTNode* pFindNode = m_pBiTree;
	bool bFind = false;

	while( NULL != pFindNode)
	{
		if( nData == pFindNode->nData )
		{
			bFind = true;
			break;
		}
		else if( (nData < pFindNode->nData) &&
				 (NULL != pFindNode->pLChild) )
		{
			pParentNode = pFindNode;
			pFindNode = pFindNode->pLChild;
			continue;
		}
		else if( (nData > pFindNode->nData) &&
			(NULL != pFindNode->pRChild) )
		{
			pParentNode = pFindNode;
			pFindNode = pFindNode->pRChild;
			continue;
		}
		else
		{
			break;
		}
	}

	if( bFind )
	{
		BiTNode* pTemp = pFindNode;

		if( NULL == pFindNode->pLChild )
		{
			if( pParentNode->pLChild == pFindNode )
			{
				pParentNode->pLChild = pFindNode->pRChild;
			}
			else if( pParentNode->pRChild == pFindNode)
			{
				pParentNode->pRChild = pFindNode->pRChild;
			}
			else
			{
				m_pBiTree = pFindNode->pRChild;
			}

			delete pTemp;
		}
		else if( NULL == pFindNode->pRChild )
		{
			if( pParentNode->pLChild == pFindNode )
			{
				pParentNode->pLChild = pFindNode->pLChild;
			}
			else if( pParentNode->pRChild == pFindNode)
			{
				pParentNode->pRChild = pFindNode->pLChild;
			}
			else
			{
				m_pBiTree = pFindNode->pLChild;
			}

			delete pTemp;
		}
		else
		{
			BiTNode* pTempTwo = pFindNode->pLChild;

			while( NULL != pTempTwo->pRChild )
			{
				pTemp = pTempTwo;
				pTempTwo = pTempTwo->pRChild;
			}

			pFindNode->nData = pTempTwo->nData;

			if( pTemp != pFindNode )
			{
				pTemp->pRChild = pTempTwo->pLChild;
			}
			else
			{
				pTemp->pLChild = pTempTwo->pLChild;
			}

			delete pTempTwo;
		}
		return true;
	}
	return false;
}


二叉树的缺点就在于树的形状与数据插入的顺序有关,下图是数据插入顺序为(45,24,12,37,53,93)与(12,24,37,45,53,93)时生成的二叉排序树:

很明显第二种情况在查找方面的效率很不理想,这是就引入了平衡二叉树。来保证树的形状比较利于查找和插入删除操作。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值