引入思想:既能满足类似折半查找的查找效率,又能保证插入和删除的效率。
概念
二叉排序树(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;
}
![](https://img-my.csdn.net/uploads/201211/10/1352538897_5164.png)
很明显第二种情况在查找方面的效率很不理想,这是就引入了平衡二叉树。来保证树的形状比较利于查找和插入删除操作。