1. 程式人生 > >二叉排序樹 C語言原始碼 插入 查詢 刪除

二叉排序樹 C語言原始碼 插入 查詢 刪除

二叉排序樹,詳細概念略過,參考資料結構書籍;詳細程式碼如下:(以下程式碼,均可直接執行)

儲存結構:二叉連結串列

typedef struct SOSTree {
    int data;
    struct SOSTree *LChild, *RChild;
} SOSTree;

插入:

bool InsertBST(SOSTree **T, int elem) {
    // 二級指標,這樣一來T可以在主函式中初始化為NULL,也能正常訪問
    SOSTree **p, *s;
    p = (SOSTree **) malloc(sizeof(SOSTree *));
    if (!SearchBST(*T, elem, NULL, p)) {
        s = (SOSTree *) malloc(sizeof(SOSTree));
        s->data = elem;
        s->RChild = s->LChild = NULL;
        if (!*T) *T = s;
        else if (LTI(elem, (**p).data)) (**p).LChild = s;
        else (**p).RChild = s;
        return true;
    }
    return false;
}

查詢:

bool SearchBST(SOSTree *T, int key, SOSTree *S, SOSTree **p) {
    // p 用與在函式之間傳遞指標變數,因此使用二級指標
    // 預設沒有兩個相同的元素
    if (!T) {
        *p = S;
        return false;
    } else if (EQI(key, T->data)) {
        *p = T;
        return true;
    } else if (LTI(key, T->data)) return SearchBST(T->LChild, key, T, p);
    else return SearchBST(T->RChild, key, T, p);
}

刪除:

bool DelBST(SOSTree **T, SOSTree *P, int elem) {
    if (!*T) return false;
    if (EQI(elem, (**T).data)) {
        // 刪除葉子結點
        if (!(**T).RChild && !(**T).LChild) {
        // 處理原二叉樹只含有根節點的情況
            if (!P) *T = NULL;
            else if (P->LChild == *T) P->LChild = NULL;
            else if (P->RChild == *T) P->RChild = NULL;
            return true;
        }
        return DelBSTNode(T);
    } else if (LTI(elem, (**T).data)) return DelBST(&(**T).LChild, *T, elem);
    else return DelBST(&(**T).RChild, *T, elem);
}

bool DelBSTNode(SOSTree **p) {
    // 刪除非葉子結點
    // 直接使用二級指標,直接對地址進行操作
    SOSTree *q, *s;
    if (!(*p)->RChild) {
        *p = (*p)->LChild;
        return true;
    } else if (!(*p)->LChild) {
        *p = (*p)->RChild;
        return true;
    } else {
        q = *p;
        s = (*p)->LChild;
        while (s->RChild) {
            q = s;
            s = s->RChild;
        }
        (*p)->data = s->data;
        if (q != *p) q->RChild = s->LChild;
        else q->LChild = s->LChild;
        return true;
    }
}

主函式:

int main() {
    SOSTree *T;
    int data1[10] = {0, 7, 1, 2, 17, 13, 9, 4, 3, 5};
    int i;
    T = NULL;
    for (i = 0; i < 10; i++)
        InsertBST(&T, data1[i]);
    DelBST(&T, NULL, 4);
    free(T);
    return 0;