1. 程式人生 > >二叉排序樹的基本操作(完整程式碼)

二叉排序樹的基本操作(完整程式碼)

以下是二叉排序樹的基本操作,函式基本與《大話資料結構》裡的程式碼類似,包括查詢、插入、刪除操作。完整程式碼,可直接執行。

//二叉排序樹
//其中有插入、刪除、查詢操作
#include<stdio.h>
#include<stdlib.h>

#define FALSE 0
#define TURE 1
#define MAXSIZE 10

typedef struct BiTNode
{
    int data;
    struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

//查詢
//f指向T的雙親,初始時為NULL
//這裡用f,*p,是問了儲存查詢時遍歷的最後一個元素,在插入時用
int SearchBST(BiTree T,int key,BiTree f,BiTree *p)
{
    if
(!T) { *p=f; return FALSE; } else if(key==T->data) { *p=T; return TURE; } else if(key<T->data) return SearchBST(T->lchild,key,T,p); else return SearchBST(T->rchild,key,T,p); } //插入 //如果插不到元素,獲取查詢時遍歷的最後一個元素 //與其比較,大則是其右子樹,反之、、 void
InsertBST(BiTree *T,int key) { BiTree p,s; if(!SearchBST(*T,key,NULL,&p)) //若樹中沒有相同元素,繼續 { s=(BiTree)malloc(sizeof(BiTNode)); s->data=key; s->lchild=s->rchild=NULL; //設定新元素s if(!p) //若樹為空,將s設為根節點 *T=s; else if(key<p->data) //
否則。。 p->lchild=s; else p->rchild=s; } else printf("抱歉,樹中已有該元素。 \n"); } //DeleteBST用到的子函式 //刪除節點無左子樹,則將其右子樹補到現在位置,反之亦然 //若左右字樹都有,則找其左子樹,然後右到底,即中序遍歷時,刪除節點的上一個元素——前驅 //以前驅作為新節點 void Delete(BiTree *p) { BiTree q,s; if((*p)->rchild==NULL) //無右,以左子樹替換 { q=*p; *p=(*p)->lchild; free(q); } else if((*p)->lchild==NULL) //無左 { q=*p; *p=(*p)->rchild; free(q); } 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; free(s); } } //刪除 void DeleteBST(BiTree *T,int key) { BiTree p; if(SearchBST(*T,key,NULL,&p)) //找與key相等的元素 { if(key==(*T)->data) Delete(T); else if(key<(*T)->data) DeleteBST(&(*T)->lchild,key); else DeleteBST(&(*T)->rchild,key); } else printf("抱歉,當前二叉樹中沒有你要刪除的元素。 \n"); } //中序輸出 void InOrder(BiTree T) { if(T) { InOrder(T->lchild); printf("%d ",T->data); InOrder(T->rchild); } else return; } void main() { int i,num; BiTree T=NULL; int a[10]={66,88,58,47,35,73,51,99,37,93}; for(i=0;i<10;i++) { InsertBST(&T,a[i]); } printf("當前的二叉樹為:"); InOrder(T); printf("\n"); printf("請輸入你要插入的元素:"); scanf("%d",&num); InsertBST(&T,num); printf("當前的二叉樹為:"); InOrder(T); printf("\n"); printf("請輸入你要刪除的元素:"); scanf("%d",&num); DeleteBST(&T,num); printf("當前的二叉樹為:"); InOrder(T); printf("\n"); }

以上是最基本的程式碼,是看《大話資料結構》時根據書上程式碼編寫的,適合最最基礎的人看,有問題可以評論,同是菜鳥,我們一起討論嘛~