您的位置:首页 > 理论基础 > 数据结构算法

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

2012-11-07 23:08 162 查看
引入思想:既能满足类似折半查找的查找效率,又能保证插入和删除的效率。

概念

二叉排序树(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)时生成的二叉排序树:



很明显第二种情况在查找方面的效率很不理想,这是就引入了平衡二叉树。来保证树的形状比较利于查找和插入删除操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: