BSTree.h
/**
* 二叉查找树(英语:Binary Search Tree),也称为二叉搜索树、有序二叉树(ordered binary tree)或排序二叉树(sorted binary tree)
* 在二叉查找树中:
* (01) 任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
* (02) 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
* (03) 任意节点的左、右子树也分别为二叉查找树。
* (04) 没有键值相等的节点(no duplicate nodes)。
*/
#pragma once
typedef int Type;
typedef struct BSTreeNode
{
Type key;
struct BSTreeNode *left;
struct BSTreeNode *right;
struct BSTreeNode *parent;
}Node, *BSTree;
void PreOrder_BSTree(BSTree root);
void InOrder_BSTree(BSTree root);
void PostOrder_BSTree(BSTree root);
Node* BSTree_Search(BSTree root, Type key);
Node* BSTree_Search_Non_Recursion(BSTree root, Type key);
Node* BSTree_Maximum(BSTree root);
Node* BSTree_Minimum(BSTree root);
Node* BSTree_Successor(Node *node);
Node* BSTree_Predecessor(Node *node);
Node* Insert_BSTree(BSTree root, Type key);
Node *Delete_BSTree(BSTree root, Type key);
void Destory_BSTree(BSTree root);
void Print_BSTree(BSTree node, Type key, int direction);
BSTree.c
#include <stdio.h>
#include <stdlib.h>
#include <BSTree.h>
static void ProcessCurrNode(BSTree root)
{
printf("%d ", root->key);
}
void PreOrder_BSTree(BSTree root)
{
if (root != NULL)
{
ProcessCurrNode(root);
PreOrder_BSTree(root->left);
PreOrder_BSTree(root->right);
}
}
void InOrder_BSTree(BSTree root)
{
if (root != NULL)
{
InOrder_BSTree(root->left);
ProcessCurrNode(root);
InOrder_BSTree(root->right);
}
}
void PostOrder_BSTree(BSTree root)
{
if (root != NULL)
{
PostOrder_BSTree(root->left);
PostOrder_BSTree(root->right);
ProcessCurrNode(root);
}
}
Node* BSTree_Search(BSTree root, Type key)
{
if (root == NULL || root->key == key)
return root;
if (key < root->key)
return BSTree_Search(root->left, key);
else
return BSTree_Search(root->right, key);
}
Node* BSTree_Search_Non_Recursion(BSTree root, Type key)
{
while (root != NULL && root->key != key)
{
if (key < root->key)
root = root->left;
else
root = root->right;
}
return root;
}
Node* BSTree_Maximum(BSTree root)
{
if (root == NULL)
return NULL;
while (root->right != NULL)
root = root->right;
return root;
}
Node* BSTree_Minimum(BSTree root)
{
if (root == NULL)
return NULL;
while (root->left != NULL)
root = root->left;
return root;
}
Node* BSTree_Successor(Node *node)
{
if (node->right != NULL)
return BSTree_Minimum(node->right);
Node *p = node->parent;
while (p != NULL && node == p->right)
{
node = p;
p = p->parent;
}
return p;
}
Node* BSTree_Predecessor(Node *node)
{
if (node->left != NULL)
return BSTree_Maximum(node->left);
Node *p = node->parent;
while (p != NULL && node == p->left)
{
node = p;
p = p->parent;
}
return p;
}
static Node* Create_BSTree_Node(Type key, Node *parent, Node *left, Node* right)
{
Node *p = (Node*)malloc(sizeof(Node));
if (p == NULL)
return NULL;
p->key = key;
p->parent = parent;
p->left = left;
p->right = right;
return p;
}
static Node* BSTree_Insert(BSTree root, Node *insnode)
{
Node *p = NULL;
Node *tmp = root;
while (tmp != NULL)
{
p = tmp;
if (insnode->key < p->key)
tmp = p->left;
else
tmp = p->right;
}
insnode->parent = p;
if (p == NULL)
root = insnode;
else if (insnode->key < p->key)
p->left = insnode;
else
p->right = insnode;
return root;
}
Node* Insert_BSTree(BSTree root, Type key)
{
Node* node = Create_BSTree_Node(key, NULL, NULL, NULL);
if (node == NULL)
return root;
return BSTree_Insert(root, node);
}
static Node* BSTree_Delete(BSTree root, Node *delnode)
{
Node *p = NULL;
Node *c = NULL;
if (delnode->left == NULL || delnode->right == NULL)
p = delnode;
else
p = BSTree_Successor(delnode);
if (p->left != NULL)
c = p->left;
else
c = p->right;
if (c != NULL)
c->parent = p->parent;
if (p->parent == NULL)
root = c;
else if (p == p->parent->left)
p->parent->left = c;
else
p->parent->right = c;
if (p != delnode)
delnode->key = p->key;
if (p != NULL)
free(p);
p = NULL;
return root;
}
Node *Delete_BSTree(BSTree root, Type key)
{
Node *delnode = BSTree_Search(root, key);
if (delnode != NULL)
root = BSTree_Delete(root, delnode);
return root;
}
void Destory_BSTree(BSTree root)
{
if (root == NULL)
return;
if (root->left != NULL)
Destory_BSTree(root->left);
if (root->right != NULL)
Destory_BSTree(root->right);
free(root);
}
void Print_BSTree(BSTree node, Type key, int direction)
{
if (node != NULL)
{
if (direction == 0)
printf("%d is root\n", key);
else
printf("%d is %d`s %s child\n", node->key, key, direction == -1 ? "left" : "right");
Print_BSTree(node->left, node->key, -1);
Print_BSTree(node->right, node->key, 1);
}
}
BSTree_Test.c
static int arr[] = { 1,5,4,3,2,6 };
void main()
{
int i, ilen;
BSTree root = NULL;
printf("== 依次添加: ");
ilen = TBL_SIZE(arr);
for (i = 0; i < ilen; i++)
{
printf("%d ", arr[i]);
root = Insert_BSTree(root, arr[i]);
}
printf("\n");
printf("\n== 前序遍历: ");
PreOrder_BSTree(root);
printf("\n== 中序遍历: ");
InOrder_BSTree(root);
printf("\n== 后续遍历: ");
PostOrder_BSTree(root);
printf("\n\n");
printf("== 最小值: %d\n", BSTree_Minimum(root)->key);
printf("== 最大值: %d\n", BSTree_Maximum(root)->key);
printf("== 树的详细信息: \n");
Print_BSTree(root, root->key, 0);
printf("\n== 删除节点: %d", arr[3]);
root = Delete_BSTree(root, arr[3]);
printf("\n== 中序遍历: ");
InOrder_BSTree(root);
Destory_BSTree(root);
printf("\n\n");
system("pause");
}
测试结果

参考:http://wangkuiwu.github.io/2013/02/01/bstree-c/