二叉搜索树概念:
二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的
二叉树
1.若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
2.若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
3。它的左右子树也分别为二叉搜索树
建立结构体:
typedef int Datatype;
typedef struct BSTreeNode
{
struct BSTreeNode *_left;
struct BSTreeNode *_right;
Datatype _data;
}BSTreeNode;
创建一个节点:
typedef int Datatype;
typedef struct BSTreeNode
{
struct BSTreeNode *_left;
struct BSTreeNode *_right;
Datatype _data;
}BSTreeNode;
BSTreeNode *BuyNode(Datatype x)//建立一个节点
{
BSTreeNode *node=(BSTreeNode *)malloc(sizeof(BSTreeNode));
assert(node);
node->_data=x;
node->_left=NULL;
node->_right=NULL;
return node;
}
搜索二叉树的增加(非递归):
BSTreeNode *BuyNode(Datatype x)//建立一个节点
{
BSTreeNode *node=(BSTreeNode *)malloc(sizeof(BSTreeNode));
assert(node);
node->_data=x;
node->_left=NULL;
node->_right=NULL;
return node;
}
int BSTreeInsert(BSTreeNode **tree,Datatype x)//搜索二叉树的插入
{
BSTreeNode *cur=*tree;
BSTreeNode *parent=NULL;//应用与插入的前一个节点,方便于连接
if (*tree==NULL)
{
*tree=BuyNode(x);
return 0;
}
while (cur)
{
if (cur->_data > x)
{
parent=cur;
cur=cur->_left;
}
else if (cur->_data < x)
{
parent=cur;
cur=cur->_right;
}
else
{
return -1;//如果二叉树里有相同的值则返回 -1
}
}
if (parent->_data < x)
{
parent->_right=BuyNode(x);
}
else
{
parent->_left=BuyNode(x);
}
// return -1;
}
int BSTreeInsert(BSTreeNode **tree,Datatype x)//搜索二叉树的插入
{
BSTreeNode *cur=*tree;
BSTreeNode *parent=NULL;//应用与插入的前一个节点,方便于连接
if (*tree==NULL)
{
*tree=BuyNode(x);
return 0;
}
while (cur)
{
if (cur->_data > x)
{
parent=cur;
cur=cur->_left;
}
else if (cur->_data < x)
{
parent=cur;
cur=cur->_right;
}
else
{
return -1;//如果二叉树里有相同的值则返回 -1
}
}
if (parent->_data < x)
{
parent->_right=BuyNode(x);
}
else
{
parent->_left=BuyNode(x);
}
// return -1;
}
搜索二叉树的增加(递归):
int BSTreeInsertR(BSTreeNode **tree,Datatype x)//递归算法 搜索二叉树的插入
{
if (*tree==NULL)
{
*tree=BuyNode(x);
return 0;
}
if ((*tree)->_data > x)
{
return BSTreeInsertR(&(*tree)->_left,x);
}
else if ((*tree)->_data < x)
{
return BSTreeInsertR(&(*tree)->_right,x);
}
else return -1;
}
搜索二叉树的删除(非递归):
int BSTreeInsertR(BSTreeNode **tree,Datatype x)//递归算法 搜索二叉树的插入
{
if (*tree==NULL)
{
*tree=BuyNode(x);
return 0;
}
if ((*tree)->_data > x)
{
return BSTreeInsertR(&(*tree)->_left,x);
}
else if ((*tree)->_data < x)
{
return BSTreeInsertR(&(*tree)->_right,x);
}
else return -1;
}