刚把数据结构c语言描述的二叉查找树这一部分看完,书上的给出了函数的定义,我都实现了一遍,有递归的和非递归的两种,源代码贴上来,留作纪念了。源文件有比较详细的注释,但是在Live Writer里面显示是乱码,希望在网页上不是乱码
tree.h头文件内容:
#ifndef _Tree_H #define _Tree_H typedef int ElementType; struct TreeNode; typedef struct TreeNode *Position; typedef struct TreeNode *SearchTree; SearchTree MakeEmpty(SearchTree T); Position Find(ElementType X,SearchTree T); Position Find_No(ElementType X,SearchTree T); Position FindMin(SearchTree T); Position FindMin_No(SearchTree T); Position FindMax(SearchTree T); Position FindMax_No(SearchTree T); SearchTree Insert(ElementType X,SearchTree T); SearchTree Insert_No(ElementType X,SearchTree T); SearchTree Delete(ElementType X,SearchTree T); SearchTree Delete_No(ElementType X,SearchTree T); ElementType Retrieve(Position P); ElementType Retrieve_No(Position P); Position Find_Prev(ElementType X,SearchTree T); #endif struct TreeNode { ElementType Element; SearchTree Left; SearchTree Right; };
tree.c源文件的内容:
#include "tree.h"
#include
#include
//????????
SearchTree MakeEmpty(SearchTree T)
{
if(T != NULL)
{
MakeEmpty(T->Left);
MakeEmpty(T->Right);
free(T);
}
return NULL;
}
//????X??????,??
Position Find(ElementType X,SearchTree T)
{
if(T == NULL)
return NULL;
if(X < T->Element)
return Find(X,T->Left);
else if(X > T->Element)
return Find(X,T->Right);
return T;
}
//????X??????,???
Position Find_No(ElementType X,SearchTree T)
{
Position ret = NULL;
if(T == NULL)
return T;
if(X == T->Element)
return T;
else if(X < T->Element)
{
Position p1 = T->Left;//???????,p1????
while (X != p1->Element)
p1 = p1->Left;
ret = p1;
}
else if(X > T->Element)
{
Position p2 = T->Right;//???????,p2????
while(X != p2->Element)
p2 = p2->Right;
ret = p2;
}
return ret;
}
//??????????,???
Position FindMin_No(SearchTree T)
{
if(T == NULL)
return NULL;
Position p = T->Left;
Position cur = NULL;
while(p != NULL)
{
cur = p;
p = p->Left;
}
return cur;
}
//??????????,??
Position FindMin(SearchTree T)
{
if(T == NULL)
return NULL;
else if(T->Left == NULL)
return T;
else
return FindMin(T->Left);
}
//??????????,???
Position FindMax_No(SearchTree T)
{
if(T == NULL)
return NULL;
Position p = T->Right;
Position cur = NULL;
while(p != NULL)
{
cur = p;
p = p->Right;
}
return cur;
}
//??????????,??
Position FindMax(SearchTree T)
{
if(T == NULL)
return NULL;
else if(T->Right == NULL)
return T;
else
return FindMax(T->Right);
}
//??
SearchTree Insert(ElementType X,SearchTree T)
{
Position p1 = NULL;
Position p2 = NULL;
if(T == NULL)
{
T = (SearchTree)malloc(sizeof(TreeNode));
if(T != NULL)
{
T->Element = X;
T->Left = NULL;
T->Right = NULL;
}
else
return NULL;
}
else
{
Position node;
node = (Position)malloc(sizeof(TreeNode));
node->Element = X;
node->Left = NULL;
node->Right = NULL;
if(X < T->Element)
{
p1 = T->Left;
Position cur = NULL;
while(p1 != NULL)
{
if(X < p1->Element)
{
cur = p1;
p1 = p1->Left;
}
else if(X > p1->Element)
{
cur = p1;
p1 = p1->Right;
}
else
return p1;
}
if(X > cur->Element)
cur->Right = node;
else
cur->Left = node;
}
else if(X > T->Element)
{
p2 = T->Right;
Position cur = NULL;
while(p2 != NULL)
{
if(X < p2->Element)
{
cur = p2;
p2 = p2->Left;
}
else if(X > p2->Element)
{
cur = p2;
p2 = p2->Right;
}
else
return p2;
}
if(X > cur->Element)
cur->Right = node;
else
cur->Left = node;
}
}
return T;
}
//????X?????????,???
Position Find_Prev(ElementType X,SearchTree T)
{
if(T == NULL)
return T;
if(X < T->Element)
{
Position p1 = T->Left;
while (X != p1->Element)
p1 = p1->Left;
return p1;
}
else if(X > T->Element)
{
Position p2 = T->Right;
while(X != p2->Element)
p2 = p2->Right;
return p2;
}
else
return T;
}
//??????
SearchTree Delete(ElementType X,SearchTree T)
{
Position X_pos = NULL;
Position ret = NULL;
if(T == NULL)
return NULL;
X_pos = Find(X,T);
if(X_pos == NULL)
return NULL;
if(X_pos->Left == NULL && X_pos->Right == NULL)//??????????,???????
{
ret = X_pos;
free(X_pos);
X_pos = NULL;
}
else if(X_pos->Left == NULL || X_pos->Right == NULL)//???????
{
Position prev = Find_Prev(X,T);//????????????
if(prev->Right == X_pos)//?????????????
{
//?????????????????????????
if(X_pos->Right != NULL)
prev->Right = X_pos->Right;
else if(X_pos->Left != NULL)
prev->Right = X_pos->Left;
}
else if(prev->Left == X_pos)
{
if(X_pos->Right != NULL)
prev->Left = X_pos->Right;
else if(X_pos->Left != NULL)
prev->Left = X_pos->Left;
}
free(X_pos);//?????????,?X_pos??NULL
X_pos = NULL;
}
else if(X_pos->Left != NULL && X_pos->Right != NULL)//???????
{
Position ptr_min = FindMin_No(X_pos->Right);//??????????????????
X_pos->Element = ptr_min->Element;
Position ptr_min_prev = Find_Prev(ptr_min->Element,X_pos->Right);
if(ptr_min_prev->Right == ptr_min)
{
if(ptr_min->Right != NULL)
ptr_min_prev->Right = ptr_min->Right;
else if(ptr_min->Left != NULL)
ptr_min_prev->Right = ptr_min->Left;
}
else if(ptr_min_prev->Left == ptr_min)
{
if(ptr_min->Right != NULL)
ptr_min_prev->Left = ptr_min->Right;
else if(ptr_min->Left != NULL)
ptr_min_prev->Left = ptr_min->Left;
}
free(X_pos);
X_pos = NULL;
}
return T;
}
void Output(SearchTree T)
{
if(T != NULL)
{
printf("%d /n",T->Element);
Output(T->Left);
Output(T->Right);
}
}
int main()
{
SearchTree T = NULL;
T = (SearchTree)malloc(sizeof(struct TreeNode));
struct TreeNode Node1;
struct TreeNode Node2;
struct TreeNode Node3;
struct TreeNode Node4;
struct TreeNode Node5;
Node1.Element = 1;
Node2.Element = 2;
Node3.Element = 3;
Node4.Element = 4;
Node5.Element = 8;
T->Element = 6;
T->Left = &Node2;
T->Right = &Node5;
Node5.Left = NULL;
Node5.Right = NULL;
Node1.Left = NULL;
Node1.Right = NULL;
Node3.Left = NULL;
Node3.Right = NULL;
Node2.Left = &Node1;
Node2.Right = &Node4;
Node4.Left = &Node3;
Node4.Right = NULL;
Output(T);
SearchTree Tptr;
int val = 7;
Tptr = Insert(val,T);
Output(T);
Position min;
min = FindMin_No(T);
printf("/n%d/n",min->Element);
Position max;
max = FindMax_No(T);
printf("/n%d/n",max->Element);
return 0;
}