数据结构 - 二叉排序树的建立、查找、插入和删除运算

二叉排序树的建立、查找、插入和删除运算

#include
#define ENDFLAG 0
// 二叉排序树的二叉链表存储表示                   
typedef struct BSTNode{
    int data;                   // 每个结点的数据域包括关键字项和其他数据项
    struct BSTNode *lchild, *rchild; // 左右孩子指针
}BSTNode, *BSTree;
BSTree T1,T2;
int SearchBST(BSTree T, int key){ // 在根指针 T 所指二叉排序树中递归地查找某关键字等于 key 的数据元素
  // 若查找成功,则返回指向该数据元素结点的指针,否则返回空指针
  	if(!T) return 2;//未找到 
    if (key == T->data) return 1;                     // 查找结束
    else if (key < T->data) return SearchBST(T->lchild, key); // 在左子树中继续查找
    else return SearchBST(T->rchild, key);                        // 在右子树中继续查找
}
void InsertBST(BSTree &T, int e){ // 当二叉排序 T 树中不存在关键字等于 e.key 的数据元素时,则插入该元素
	BSTree S; 
	if (!T){                                 // 找到插入位置,递归结束
        S = new BSTNode;              // 生成新结点 *S
        S->data = e;                  // 新结点 *S 的数据域置为 e
        S->lchild = S->rchild = NULL; // 新结点 *S 作为叶子结点
        T = S;                        // 把新结点 *S 链接到已找到的插入位置
    }
    else if (e < T->data)
    InsertBST(T->lchild, e);      // 将 *S 插入左子树
    else if (e > T->data)
	InsertBST(T->rchild, e);      // 将 *S 插入右子树
}
void DeleteBST(BSTree &T, int key){ // 从二叉排序树 T 中删除关键字等于 key 的结点
    BSTree p,f,q,s;
	p = T; f = NULL; // 初始化
  /* 查找关键字为 key 的结点 *p */
    while (p){
        if(p->data == key) break;         // 找到关键字等于 key 的结点 *p 时循环结束
        f = p;                                // *f 为 *p 的双亲结点
        if (p->data > key) p = p->lchild; // 在 *p 的左子树中继续查找
        else p = p->rchild;                   // 在 *p 的右子树中继续查找
    }
    if (!p) return;                           // 找不到被删结点则返回
  /* 结点的 3 种删除情况 */
    q = p;
    if ((p->lchild) && (p->rchild)){           // 被删结点 *p 左右子树均不空
        s = p->lchild;
        while (s->rchild){                     // 在 *p 的左子树中继续查找其前驱结点,即是右下结点
            q = s;
            s = s->rchild;                    // 一直向右
        }
        p->data = s->data;                    // s 指向被删结点的前驱
        if (q != p) q->rchild = s->lchild;    // 重接 *q 的右子树
        else q->lchild = s->lchild;           // 重接 *q 的左子树
        delete s;
        return;  
    }                                         // if
    else if (!p->rchild) p = p->lchild;       // 被删结点 *p 无右子树,只需重接其左子树
    else if (!p->lchild) p = p->rchild;       // 被删结点 *p 无左子树,只需重接其右子树
  /* 将 p 所指的子树挂接到其双亲结点 *f 相应的位置 */
    if (!f) T = p;                            // 被删结点为根结点
    else if (q == f->lchild) f->lchild = p;   // 挂接到 *f 的左子树位置
    else f->rchild = p;                       // 挂接到 *f 的右子树位置
    delete q;
}
void order(BSTree T){//中序输出
    if (T == NULL) {
        return;
    }
    order(T->lchild);
    printf("%d ", T->data);
    order(T->rchild);
}
int main(){
	int i,j;
	int a[7] = {5,4,2,1,7,3,6};
	int b[7] = {1,2,3,4,5,6,7};
    for (i = 0; i < 7; i++) {
    	InsertBST(T1,a[i]);
    	InsertBST(T2,b[i]);
	}
	printf("请输入要在第一组数据中查找的数:");
	scanf("%d",&i);
	j=SearchBST(T1,i);
	if(j==1)
	printf("找到了!");
	else
	printf("未找到!");
	printf("\n"); 
	printf("请输入要在第二组数据中查找的数:");
	scanf("%d",&i);
	j=SearchBST(T2,i);
	if(j==1)
	printf("找到了!");
	else
	printf("未找到!");
	printf("\n"); 
    printf("中序遍历二叉排序树:\n");
    order(T1);
    printf("\n");
	order(T2);
	printf("\n");
	printf("请输入要删除的数:");
	scanf("%d",&i);
    printf("删除%d后,中序遍历二叉排序树:\n",i);
    DeleteBST(T1,i);
    order(T1);
    printf("\n");
    DeleteBST(T2,i);
    order(T2);
    printf("\n");
	return 0;
}

你可能感兴趣的:(数据结构,数据结构,算法,链表,c语言)