1. 程式人生 > >二叉查找樹ADT--C語言描述

二叉查找樹ADT--C語言描述

typedef eof find eem ret fin make ready let

首先給出此ADT的聲明:

 1 struct TreeNode;
 2 typedef struct TreeNode *Position;
 3 typedef struct TreeNode *SearchTree;
 4 
 5 SearchTree MakeEmpty(SearchTree T);
 6 Position Find(ElementType X, SearchTree T);
 7 Position FindMax(SearchTree T);
 8 Position FindMin(SearchTree T);
 9 SearchTree Insert(ElementType X, SearchTree T);
10 SearchTree Delete(ElementType X, SearchTree T); 11 ElementType Retrieve(Position P); 12 13 struct TreeNode{ 14 ElementType Element; 15 SearchTree Left; 16 SearchTree Right; 17 };

1、MakeEmpty的實現

1 SearchTree MakeEmpty(SearchTree T){
2     if(T != NULL){
3         MakeEmpty(T->Left);
4 MakeEmpty(T->Right); 5 free(T); 6 } 7 return NULL; 8 }

2、Find的實現

 1 Position Find(ElementType X, SearchTree T){
 2     if(T == NULL)
 3         return NULL;
 4     else if(X < T->Element)
 5         return Find(X, T->Left);
 6     else if(X > T->Element)
7 return Find(X, T->Right); 8 else 9 return T; 10 }

3、FindMax和FindMin的實現(一個遞歸 一個非遞歸)

Position FindMin(SearchTree T){
    if(T == NULL)
        return NULL;
    else if(T->Left == NULL)
        return T;
    else
        return FindMin(T->Left);
}

Position FindMax(SearchTree T){
    if(T != NULL)
        while(T->Right != NULL)
            T = T->Right;
    return T;
}

4、Insert的實現

 1 SearchTree Insert(ElementType X, SearchTree T){
 2     if(T == NULL){
 3         T = (SearchTree)malloc(sizeof(struct TreeNode));
 4         T->Element = X;
 5         T->Left = T->Right = NULL;
 6     }
 7     else if(X < T->Element)
 8         T->Left = Insert(X, T->Left);
 9     else if(X > T->Element)
10         T->Right = Insert(X, T->Right);
11     
12     // Else X is in the tree already, we‘ll do nothing!
13     return T;
14 }

5、Delete的實現

 1 SearchTree Delete(ElementType X, SearchTree T){
 2     Position TmpCell;
 3 
 4     if(T == NULL)
 5         printf("Element Not Found\n");
 6     else if(X < T->Element)
 7         T->Left = Delete(X, T->Left);
 8     else if(X > T->Element)
 9         T->Right = Delete(X, T->Right);
10     else if(T->Left && T->Right){
11         TmpCell = FindMin(T->Right);
12         T->Element = TmpCell->Element;
13         T->Right = Delete(TmpCell->Element, T->Right);
14     }
15     else{
16         TmpCell = T;
17         if(!(T->Left))
18             T = T->Right;
19         else if(!(T->Right))
20             T = T->Left;
21         free(TmpCell);
22     }
23     return T;
24 }

二叉查找樹ADT--C語言描述