二叉排序树的插入规则:
在二叉排序树中插入新结点,要保证插入后的二叉树仍符合二叉排序树的定义。
插入过程:若二叉排序树为空,则待插入结点*S作为根结点插入到空树中;
当非空时,将待插结点关键字S->key和树根关键字t->key进行比较,
若s->key = t->key,则无须插入,若s->key< t->key,则插入到根的左子树中,
若s->key> t->key,则插入到根的右子树中。而子树中的插入过程和在树中的插入过程相同,
如此进行下去,直到把结点*s作为一个新的树叶插入到二叉排序树中,或者直到发现树已有相同关键字的结点为止。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/* 定义结构体 */
typedef int TypeData;
typedef struct stBiTreeNode
{
TypeData data;
struct stBiTreeNode *lchild, *rchild;
}BITREENODE;
/*
* 函数功能:判断要插入的数据是否存在
* 函数参数:root 根节点
data 要查询的数据
lastNode 如果没有找到,则返回查找最后一个节点
* 返回值: 0 存在 1 不存在 2 树是空树
*/
int isDataAlreadyExist(BITREENODE* root, TypeData data,BITREENODE** lastNode)
{
BITREENODE* temp = root;
/* 如果根节点是空的,则直接返回 */
if(!temp)
{
return 2;
}
while(1)
{
/* 如果存在直接返回 */
if(temp->data == data)
{
return 0;
}
if(temp->data < data)
{
if(temp->rchild == NULL)
{
/* 把最后一个节点的地址返回出去 */
(*lastNode) = temp;
return 1;
}
temp = temp->rchild;
}
else
{
if(temp->lchild == NULL)
{
/* 把最后一个节点的地址返回出去 */
(*lastNode) = temp;
return 1;
}
temp = temp->lchild;
}
}
}
/* 在二叉排序树中插入数据 */
BITREENODE* createSortBiTree(BITREENODE* root,TypeData data)
{
int ret = 0;
BITREENODE* pLastNode = NULL;
/* 判断要插入的数据是否存在 */
ret = isDataAlreadyExist(root,data,&pLastNode);
/* 如果已经存在了 */
if(ret == 0)
{
return root;
}
/* 如果没有找到,就把这个插入 */
if(ret == 1)
{
BITREENODE* pNewNode = (BITREENODE*)malloc(sizeof(BITREENODE));
pNewNode->data = data;
pNewNode->lchild = pNewNode->rchild = NULL;
/* 插入到右孩子 */
if(pLastNode->data < data)
{
pLastNode->rchild = pNewNode;
}
/* 插入到左孩子 */
else if(pLastNode->data > data)
{
pLastNode->lchild = pNewNode;
}
}
/* 根节点是空的,则新建一个根节点*/
if(ret == 2)
{
BITREENODE* pNewNode = (BITREENODE*)malloc(sizeof(BITREENODE));
pNewNode->data = data;
pNewNode->lchild = pNewNode->rchild = NULL;
root = pNewNode;
}
return root;
}
/* 中序遍历该二叉排序树 */
int inOrderBiTree(BITREENODE* root)
{
if(root)
{
inOrderBiTree(root->lchild);
printf("%d ",root->data);
inOrderBiTree(root->rchild);
}
return 0;
}
int main()
{
BITREENODE* root = NULL;
/* 在二叉排序树种插入数据 */
root = createSortBiTree(root,20);
root = createSortBiTree(root,30);
root = createSortBiTree(root,10);
root = createSortBiTree(root,25);
inOrderBiTree(root);
printf("\n");
return 0;
}