1. 程式人生 > >C語言實現二叉排序樹

C語言實現二叉排序樹

二叉排序樹的插入規則:

在二叉排序樹中插入新結點,要保證插入後的二叉樹仍符合二叉排序樹的定義。
插入過程:若二叉排序樹為空,則待插入結點*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; }