本文用C语言实现二叉排序树,以下是源码:
#include "search_tree.h"
#include "malloc.h"
SearchTree CreatSearchTree(void)
{
return NULL;
}
SearchTree MakeEmpty(SearchTree T)
{
if (T != NULL)
{
MakeEmpty(T->Left);
MakeEmpty(T->Right);
free(T);
}
return NULL;
}
Position Find(SearchTree T, ElementType X)
{
if (T == NULL)
{
printf("Element X is not in the search_tree!\r\n");
return NULL;
}
if (X < T->Element)
{
return Find(T->Left, X);
}
else if (X>T->Element)
{
return Find(T->Right, X);
}
else
{
return T;
}
}
Position FindMax(SearchTree T)
{
while (T->Right != NULL)
{
T = T->Right;
}
return T;
}
Position FindMin(SearchTree T)
{
while (T->Left != NULL)
{
T = T->Left;
}
return T;
}
SearchTree Insert(SearchTree T, ElementType X)
{
if (T == NULL)
{
T = (SearchTree)malloc(sizeof(SearchTreeNode));
if (T == NULL)
{
printf("Out of space!\r\n");
return NULL;
}
T->Element = X;
T->Left = T->Right = NULL;
}
else if (X < T->Element)
{
T->Left = Insert(T->Left, X);
}
else if (X > T->Element)
{
T->Right = Insert(T->Right, X);
}
return T;
}
SearchTree Delete(SearchTree T, ElementType X)
{
Position TmpCell;
if (T == NULL)
{
printf("Element X is not in the tree! \r\nCan't delete X!\r\n");
}
else if (X < T->Element)
{
T->Left = Delete(T->Left, X);
}
else if (X>T->Element)
{
T->Right = Delete(T->Right, X);
}
else if (T->Left && T->Right)
{
TmpCell = FindMin(T->Right);
T->Element = TmpCell->Element;
T->Right = Delete(T->Right, T->Element);
}
else
{
TmpCell = T;
if (T->Left == NULL)
{
T = T->Right;
}
else if (T->Right == NULL)
{
T = T->Left;
}
free(TmpCell);
}
return T;
}
ElementType Retrieve(Position P);
/*返回二者中较大的*/
static int32_t Max(int32_t a, int32_t b)
{
return a > b ? a : b;
}
/*递归实现计算树的高度*/
int32_t Height(SearchTree T)
{
if (T != NULL)
{
return (1 + Max(Height(T->Left), Height(T->Right)));
}
return -1;
}
void PrintAllNodeRising(SearchTree T)
{
if (T == NULL)
{
return;
}
PrintAllNodeRising(T->Left);
printf("%d\r\n", T->Element);
PrintAllNodeRising(T->Right);
}
void PrintAllNodeFalling(SearchTree T)
{
if (T == NULL)
{
return;
}
PrintAllNodeFalling(T->Right);
printf("%d\r\n", T->Element);
PrintAllNodeFalling(T->Left);
}
static void PrintNodeName(SearchTree T, uint32_t Depth)
{
for (uint16_t i = 0; i < Depth; i++)
{
putchar('*');
}
printf("%d\r\n", T->Element);
}
static void PrintNode(SearchTree T, uint32_t Depth)
{
if (T != NULL)
{
PrintNodeName(T, Depth);
PrintNode(T->Left, Depth + 1);
PrintNode(T->Right, Depth + 1);
}
}
void PrintAllNode(SearchTree T)
{
PrintNode(T, 0);
}
#ifndef __SEARCH_TREE_H_
#define __SEARCH_TREE_H_
#include "stdint.h"
#include <stdio.h>
#include <stdbool.h>
typedef int64_t ElementType;
typedef struct node
{
ElementType Element;
struct node *Left;
struct node *Right;
} SearchTreeNode;
typedef SearchTreeNode *PtrToNode;
typedef PtrToNode SearchTree;
typedef PtrToNode Position;
SearchTree CreatSearchTree(void);
SearchTree MakeEmpty(SearchTree T);
Position Find(SearchTree T, ElementType X);
Position FindMax(SearchTree T);
Position FindMin(SearchTree T);
SearchTree Insert(SearchTree T, ElementType X);
SearchTree Delete(SearchTree T, ElementType X);
ElementType Retrieve(Position P);
int32_t Height(SearchTree T);
void PrintAllNodeRising(SearchTree T);
void PrintAllNodeFalling(SearchTree T);
void PrintAllNode(SearchTree T);
#endif