头文件定义:
#ifndef BTREE_H
#define BTREE_H
#define BTRUE (1)
#define BFALSE (0)
/* orderType */
#define PRE_ORDER (1)
#define IN_ORDER (2)
#define POST_ORDER (3)
typedef struct BTree
{
int value;
struct BTree* leftTree;
struct BTree* rightTree;
}BTree_S;
BTree_S* createBTree(int arr[], int arrLen);
void traversalBTree(BTree_S* root, int delFlag, int orderType);
#endif
二叉查找树实现:
#include <stdio.h>
#include <malloc.h>
#include <memory.h>
#include "bTree.h"
BTree_S* createNode(int nodeValue)
{
BTree_S* node = NULL;
node = (BTree_S*)malloc(sizeof(BTree_S));
if(NULL == node)
{
printf("malloc node(%d) failed.", nodeValue);
return NULL;
}
memset(node, 0, sizeof(BTree_S));
node->value = nodeValue;
return node;
}
void insertNodeIntoBTree(BTree_S *root, int nodeValue)
{
if(nodeValue <= root->value)
{
if(NULL == root->leftTree)
{
root->leftTree = createNode(nodeValue);
}
else
{
insertNodeIntoBTree(root->leftTree, nodeValue);
}
}
else
{
if(NULL == root->rightTree)
{
root->rightTree = createNode(nodeValue);
}
else
{
insertNodeIntoBTree(root->rightTree, nodeValue);
}
}
}
BTree_S* createBTree(int arr[], int arrLen)
{
int index = 0;
BTree_S* root = NULL;
/* create root node using arr[0] */
root = createNode(arr[0]);
if(NULL == root)
{
return NULL;
}
/* traverse arr[1..arrLen-1], insert key into created BTree */
for(index = 1; index < arrLen; index++)
{
insertNodeIntoBTree(root, arr[index]);
}
return root;
}
void traverseBTree(BTree_S* root, int delType, int orderType)
{
if(NULL == root)
{
return;
}
if(PRE_ORDER == orderType)
{
printf("%d ", root->value);
}
traverseBTree(root->leftTree, delType, orderType);
if(IN_ORDER == orderType)
{
printf("%d ", root->value);
}
traverseBTree(root->rightTree, delType, orderType);
if(POST_ORDER == orderType)
{
printf("%d ", root->value);
}
if(BTRUE == delType)
{
//printf("[del %d] ", root->value);
free(root);
root = NULL;
}
return;
}
测试代码:
#include <stdio.h>
#include "bTree.h"
int main()
{
int arr[] = {10, 2, 27,9, 8, 15, 50, 1};
int arrLen = sizeof(arr) / sizeof(int);
BTree_S *root = NULL;
root = createBTree(arr, arrLen);
traverseBTree(root, BTRUE, IN_ORDER);
printf("\n");
}