【概念】
什么是二叉搜索树?
二叉搜索树又称二叉排序树(按照中序遍历,可以得到一组有序的序列),它或者是一颗空树,或者是具有以下性质的二叉树:
若他的左子树不为空,则左子树上所有节点的值都小于根结点的值。
若他的右子树不为空,则右子树上所有节点的值都大于根结点的值。
他的左右子树也分别为二叉搜索树。
【二叉搜索树的简单操作】
查找
根据二叉搜索树的性质可知,在一棵树中,根节点比其左子树任何一个值都大,比右子树任何一个值都小,所以可将查找分为三步(前提:根节点不为空):
- 用待查找的值=根节点的值,则直接返回true;
- 如果待查找的值>根节点的值,则在其右子树中查找;
- 如果待查找的值<根节点的值,在其左子树中查找。
话不多说,直接上代码(首先是非递归)
int BSTreeNodeFindNor(BSTreeNode pRoot,DataType data)//查找(非递归)
{
if (NULL == pRoot)
{
printf("树为空\n");
}
while (pRoot)
{
if (pRoot->_data == data)
{
return 1;
}
else if (pRoot->_data > data)
{
pRoot = pRoot->_pLeft;
}
else if (pRoot->_data < data)
{
pRoot = pRoot->_pRight;
}
else
{
return 0;
}
}
return 0;
}
递归
int BSTreeNodeFind(BSTreeNode pRoot, DataType data)//查找(递归)
{
if (NULL == pRoot)
{
return 0;
}
else
{
if (data == pRoot->_data)
return 1;
else if (data < pRoot->_data)
return BSTreeNodeFind(pRoot->_pLeft, data);
else if (data > pRoot->_data)
return BSTreeNodeFind(pRoot->_pRight, data);
}
return 0;
}
插入
在二叉搜索树中插入新元素时,必须确保该元素不在二叉树中,如果在则不进行插入,否则将新元素插入到搜索停止的地方。具体步骤分为两步:
- 树为空,则直接插入,然后返回;
- 树不为空,按二叉搜索树的性质查找插入的位置,若带插入的元素小于她的双亲,则插入到双亲左侧,否则插入到双亲右侧。
具体代码框架如图所示:
非递归代码如下:
void BSTreeNodeInsertNor(BSTreeNode* pRoot, DataType data)//插入(非递归)
{
//树为空,直接插入
if (NULL == *pRoot)
{
*pRoot = BuyBSTreeNode(data);
return;
}
//树不为空
//找插入位置
else
{
BSTreeNode pCur = NULL;
BSTreeNode pParent = NULL;
assert(pRoot);
pCur = *pRoot;
while (pCur)
{
if (data == pCur->_data)
{
return;
}
else if (data < pCur->_data)
{
pParent = pCur;
pCur = pCur->_pLeft;
}
else if (data > pCur->_data)
{
pParent = pCur;
pCur = pCur->_pRight;
}
else
{
return;
}
}
if (pParent->_data<data)
pParent->_pRight = BuyBSTreeNode(data);
else if (pParent->_data>data)
pParent->_pLeft = BuyBSTreeNode(data);
}
}
递归代码如下:
int BSTreeNodeInsert(BSTreeNode* pRoot, DataType data)//插入(递归)
{