C語言實現二叉排序樹
阿新 • • 發佈:2019-01-10
二叉排序樹的插入規則:
在二叉排序樹中插入新結點,要保證插入後的二叉樹仍符合二叉排序樹的定義。
插入過程:若二叉排序樹為空,則待插入結點*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;
}