查找樹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;
}
相關文章
相關標籤/搜索