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

来源:互联网 发布:mac 串口调试工具 编辑:程序博客网 时间:2024/06/05 15:01

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

概念

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

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



原创粉丝点击