首先来看看二叉搜索树的概念
二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树
- 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
- 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
- 它的左右子树也分别为二叉搜索树
二叉搜索树的结构体
#define bool int
#define true 1
#define false 0
typedef int BDataType;
typedef struct BSTreeNode
{
struct BSTreeNode* _pLeft;
struct BSTreeNode* _pRight;
BDataType _data;
}BSTNode;
初始化
void InitBSTree(BSTNode** pRoot)//初始化
{
assert(pRoot);
*pRoot = NULL;
}
插入
在二叉搜索树中插入新元素时,必须先检测该元素是否在数中已经存在。如果已经存在,则不进行插入;否则将新元素加入到搜索停止的地方。
BSTNode* BuyBSTreeNode(BDataType data)
{
BSTNode* pNewNode = (BSTNode*)malloc(sizeof(BSTNode));
if (pNewNode == NULL)
{
perror("malloc::BuyBSTreeNode");
return NULL;
}
pNewNode->_data = data;
pNewNode->_pLeft = NULL;
pNewNode->_pRight = NULL;
return pNewNode;
}
非递归
bool InSertBSTree(BSTNode** pRoot, BDataType data)//插入
{
BSTNode* parent = NULL;
BSTNode* pNewNode = NULL;
BSTNode* pCur = NULL;
assert(pRoot);
pCur = *pRoot;
//空树 ---- 直接插入
if (*pRoot == NULL)
{
*pRoot = BuyBSTreeNode(data);
return true;
}
//找该结点在二叉搜索树中的插入位置
while (pCur)
{
parent = pCur;
if (data < pCur->_data)
pCur = pCur->_pLeft;
else if (data > pCur->_data)
pCur = pCur