二叉排序樹 C語言原始碼 插入 查詢 刪除
阿新 • • 發佈:2019-02-13
二叉排序樹,詳細概念略過,參考資料結構書籍;詳細程式碼如下:(以下程式碼,均可直接執行)
儲存結構:二叉連結串列
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;