完整源代码在此
1、二叉搜索树的概念
二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树。
- 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
- 若它的右子树不为空,则右子树上所有的节点的值都大于根节点的值
- 它的左右子树也分为二叉搜索树
此二叉树的中序遍历结果为: 0,1,2,3,4,5,6,7,8,9;
2、二叉搜索树的基本操作
1.初始化二叉搜索树
- 令二叉树的根节点指向NUL
void InitBSTree(BSTNode** pRoot)
{
assert(pRoot);
*pRoot = NULL;
}
2. 插入
非递归
- 如果树为空,直接插入
- 如果树不为空,根据二叉搜索树的性质,我们想让data和根节点比较,如果大于根节点,则在和右子树比较,如果小于,则和左子树比较,直到找到插入位置,将新节点插入
- 如果该元素在树中已存在,则直接返回
void InsertBSTree(BSTNode** pRoot, DataType data)
{
BSTNode * pCur = NULL;
BSTNode * pParent = NULL;
//如果根结点为空,直接插入
if (NULL == (*pRoot))
*pRoot = BuyBSTNode(data);
pCur = *pRoot;
while (pCur)
{
if (pCur->_data > data)
{
pParent = pCur;
pCur = pCur->pLeft;
}
else if (pCur->_data < data)
{
pParent = pCur;
pCur = pCur->pRight;
}
//如果有结点和data相等,直接返回
else
{
return;
}
}
pCur = BuyBSTNode(data);
//如果双亲的值大于它,则让双亲的左指针域指向它
if (pParent->_data > pCur->_data)
{
pParent->pLeft