查找树ADT--二叉查找树

二叉树的一个重要应用是它们在查找中的使用。spa

二叉查找树的性质:对于树中的每一个节点X,它的左子树中全部项的值小于X中的项,而它的右子树中全部项的值大于X中的项。这意味着该树全部的元素能够用某种一致的方式排序。code

二叉查找树的平均深度是O(logN)。二叉查找树要求全部的项都可以排序。树中的两项总能够使用Comparable接口中的compareTo方法比较。排序

ADT的声明:递归

struct TreeNode;
typedef struct TreeNode *Position;
typedef struct TreeNode *SearchTree;

SearchTree MakeEmpty(SearchTree T);
Position Find(ElementType X, SearchTree T);
Position FindMax(SearchTree T);
Position FindMin(SearchTree T);
SearchTree Insert(ElementType X, SearchTree T);
SearchTree Delete(ElementType X, SearchTree T);
ElementType Retrieve(Position P);

struct TreeNode{
    ElementType Element;
    SearchTree Left;
    SearchTree Right;
};

一、MakeEmpty的实现

SearchTree MakeEmpty(SearchTree T){
    if(T != NULL){
        MakeEmpty(T->Left);
        MakeEmpty(T->Right);
        free(T);
    }
    return NULL;
}

二、Find的实现

Position Find(ElementType X, SearchTree T){
    if(T == NULL)
        return NULL;
    else if(X < T->Element)
        return Find(X, T->Left);
    else if(X > T->Element)
        return Find(X, T->Right);
    else
        return T;
}

三、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;
}

四、Insert的实现

SearchTree Insert(ElementType X, SearchTree T){
    if(T == NULL){
        T = (SearchTree)malloc(sizeof(struct TreeNode));
        T->Element = X;
        T->Left = T->Right = NULL;
    }
    else if(X < T->Element)
        T->Left = Insert(X, T->Left);
    else if(X > T->Element)
        T->Right = Insert(X, T->Right);
    
    // Else X is in the tree already, we'll do nothing!
    return T;
}

五、Delete的实现

SearchTree Delete(ElementType X, SearchTree T){
    Position TmpCell;

    if(T == NULL)
        printf("Element Not Found\n");
    else if(X < T->Element)
        T->Left = Delete(X, T->Left);
    else if(X > T->Element)
        T->Right = Delete(X, T->Right);
    else if(T->Left && T->Right){
        TmpCell = FindMin(T->Right);
        T->Element = TmpCell->Element;
        T->Right = Delete(TmpCell->Element, T->Right);
    }
    else{
        TmpCell = T;
        if(!(T->Left))
            T = T->Right;
        else if(!(T->Right))
            T = T->Left;
        free(TmpCell);
    }
    return T;
}
相关文章
相关标签/搜索