二叉查找树ADT--C语言描述

首先给出此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 }

 

posted @ 2018-04-12 13:59  赵永驰  阅读(310)  评论(0编辑  收藏  举报