二叉排序樹的基本操作(完整程式碼)
阿新 • • 發佈:2019-01-04
以下是二叉排序樹的基本操作,函式基本與《大話資料結構》裡的程式碼類似,包括查詢、插入、刪除操作。完整程式碼,可直接執行。
//二叉排序樹
//其中有插入、刪除、查詢操作
#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");
}
以上是最基本的程式碼,是看《大話資料結構》時根據書上程式碼編寫的,適合最最基礎的人看,有問題可以評論,同是菜鳥,我們一起討論嘛~