数据结构笔记-二叉排序树
2012-11-07 23:08
162 查看
引入思想:既能满足类似折半查找的查找效率,又能保证插入和删除的效率。
1. 若它的左子树不空,则左子树上的所有结点的值均小于它的根结点的值;
2. 若它的右子树不空,则右子树上的所有结点的值均大于它的根结点的值;
3. 它的左、右子树也分别为二叉排序树;
删除操作
代码如下:
二叉树的缺点就在于树的形状与数据插入的顺序有关,下图是数据插入顺序为(45,24,12,37,53,93)与(12,24,37,45,53,93)时生成的二叉排序树:
很明显第二种情况在查找方面的效率很不理想,这是就引入了平衡二叉树。来保证树的形状比较利于查找和插入删除操作。
概念
二叉排序树(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)时生成的二叉排序树:
很明显第二种情况在查找方面的效率很不理想,这是就引入了平衡二叉树。来保证树的形状比较利于查找和插入删除操作。
相关文章推荐
- 数据结构编程笔记二十五:第九章 查找 二叉排序树(动态查找表)查找算法的实现
- 数据结构学习笔记 --- 二叉排序树和平衡二叉树(动态查找表)
- 任哲版《嵌入式实时操作系统 ucos ii》笔记【1】--------基本数据结构TCB
- 数据结构-学习笔记0
- Redis入门笔记-redis内部数据结构(01)
- 数据结构笔记之数据结构基本概述(二)
- 数据结构学习笔记-2.顺序查找与折半查找比较
- python学习笔记(1-5)- 数据结构映射之字典
- 数据结构----树(笔记)
- 数据结构学习笔记3(链表 下 双向链表&单链表逆转)
- 数据结构学习笔记 模拟算法1
- 数据结构综合性实验:多种功能的平衡二叉排序树
- 数据结构编程笔记八:第三章 栈和队列 顺序栈和进位制程序的实现
- 数据结构笔记1
- 程序员数据结构笔记[zz]
- js:数据结构笔记13--检索算法
- JavaScript数据结构之 二叉排序树
- nginx 学习笔记(三)基本数据结构
- linux设备驱动第三版笔记---->linux驱动重要数据结构之file_operations
- 程序员数据结构笔记3