二叉搜索树:
对于树中的每个节点X,它的左子树中所有项的值都小于X,右子树所有值都大于X,并且没有重复。
一、构造树:
树可以由一个个的节点构成,所以先定义节点结构体,和数据类型变量重命名
typedef int BSTDataType;
typedef struct BSTreeNode
{
struct BSTreeNode* _left;
struct BSTreeNode* _right;
BSTDataType _data;
}BSTreeNode;
二、插入节点:
每插入一个节点的时候,与当前节点判断,如果比当前节点大,就往右插入(右边没有节点的情况下),否则往左边插入。如果左右都有子节点,则继续进行比较。
代码:
//插入
int BSTreeInsert(BSTreeNode** tree, BSTDataType x)
{ //注意要传入二级指针,因为tree的跟可能不存在,不存在的话一级指针访问就会出现错误
BSTreeNode* cur, *parent;
if (*tree == NULL) //如果是空树,就创建一个根返回(1表示成功)
{
*tree = BuyBSTreeNode(x);
return 1;
}
cur = *tree;//cur指向根节点
parent = NULL;
while (cur) //cur指向当前节点,当前节点不为空时,x如果大于当前值就往右走,小于就往左走
{
if (cur->_data >x)
{
parent = cur;
if (cur->_left)
{
cur = cur->_left;
}
else
{
break;
}
}
else if (cur->_data < x)
{
parent = cur;
if (cur->_right)
{
cur = cur->_right;
}
else
{
break;
}
}
else//否则就是存在相同的,无法插入,返回0
{
return 0;
}
}
//走到这里,cur已经为空,说明可以插入了,就按定义插入
if (parent->_data < x)
{
parent->_right = BuyBSTreeNode(x);
}
else
{
parent->_left = BuyBSTreeNode(x);
}
return 1;//插入成功
}
//创建节点(辅助插入)
BSTreeNode* BuyBSTreeNode(BSTDataType x){
BSTreeNode* pbst = (BSTreeNode*)malloc(sizeof(BSTreeNode));
pbst-