二叉排序樹的查找刪除

#include "stdio.h"
#include "math.h"


//二叉排序樹
typedef struct BiTNode//結點結構
{
int data;
struct BiTNode *lchild, *rchild;
}BiTNode,*BiTNree;


//遞歸查找二叉排序樹T中是否存在key
//指針f指向T的雙親,其初始調用值爲null
//如果查找成功,指針p指向這個元素結點,返回ture,否則指針p指向查找路徑上的最後一個結點並且返回false


int SearchBST(BiTNree T, int key, BiTNree f, BiTNree *p)
{
if (!T)//查找不成功
{
*p = f;
return false;
}
else if (key == T->data)
{
*p = T;
return true;
}
else if (key < T->data)
return SearchBST(T->lchild, key, T, p);
else
return  SearchBST(T->rchild, key, T, p);
}




//二叉排序樹的插入操作


//當二叉排序樹中不存在關鍵字等於key的數據元素時,插入key並返回true,否則就返回false
int InsertBST(BiTNree *T, int key)
{
BiTNree p,s;
if (!SearchBST(*T, key, NULL, &p))//查找不成功
{
s = (BiTNree*)malloc(sizeof(BiTNree));
s->data = key;
s->lchild = s->rchild = NULL;
if (!p)
*T = s;//插入s爲新的根節點
else if (key < p->data)
p->lchild = s;
else
p->rchild = s;
return true;
}


else
return false;
}




int main()
{
int i;
int a[10] = { 62, 88, 58, 47, 35, 73, 51, 99, 37, 93 };
BiTree T = NULL;
for (i = 0; i < 0; i++)
{
InsertBST(&T, a[i]);
}
}


//如果二叉排序樹T中存在關鍵字等於key的數據元素時,就刪除這個元素結點並且返回true,否則返回false
int DeleteBST(BiTree *T, int key)
{
if (!*T)//不存在關鍵字等於key的數據元素
return false;
else
{
if (key == (*T)->data)//找到關鍵字等於key的數據元素
return  DELETE(T);
else if (key < (*T)->data)
return DeleteBST((*T)->lchild, key);
else
return DeleteBST((*T)->rchild, key);
}
}




int 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;//s指向被刪結點的直接前驅
if (q != *p)
q->rchild = s->lchild;//重接q的右子樹
else
q->lchild = s->lchild;//重接q的左子樹
free(s);
}
return true;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章