二叉排序树

#include<stdio.h>
#include<stdlib.h>
#define FALSE 0
#define TRUE 1
#define ERROR 0
#define OK 1
typedef int status;
typedef int Elemtype;
typedef struct BiTNode {
    ElemType data;
    struct node*lchild, *rchild;
}BiTNode, *BiTree;
void InitTree(BiTree &bt, int n)
{//建立二叉排序树
    int data, i;
    scanf("%d", &data);
    bt = (BiTree)malloc(sizeof(BiNode));
    bt->data = data;
    bt->lchild = bt->rchild = NULL;
    for (i = 1;i < n;i++)
    {
        scanf("%d", &data);
        Insert(bt, data);
    }
}
BiTree SearchBST(BiTree T, Elemtype key) {
    //在T指向根的二叉排序树递归的查找关键字等于key的元素
    //若找到返回该结点的指针否则返回null
    if (T == NULL) return NULL;
    else if (T->data == key)return T;
    else if(T->data > key)
        return SearchBST(T->lchild, key);
    else return SearchBST(T->rchild, key);
}
status InsertBST(BiTree &T, Elemtype e) {
    //当二叉排序树不存在关键字等于e的数据元素时,插入元素e并返回true否则返回false
    BiTree p = T, father = NULL;
    while (p&&p->data != e) {
        father = p;
        if (e > p->data)
            p = p->rchild;
        else
            p = p->lchild;
    }
    if (p) return FALSE;
    s = (BiTree)malloc(sizeof(BiTNode));//为新结点分配空间
    s->data = e;
    s->lchild = s->rchild = NULL;
    if (!father) T = s;
    else if (e > father->data) father->rchild = s;
    else father->lchild = s;
    //二叉排序树的插入只在叶子节点进行
}
status DeleteBST(BiTree &T, Elemtype e) {
    //若二叉排序树中存在关键字等于e的元素,删除该数据元素结点并返回true否则返回false
    BiTree q, s;
    if (!T->lchild && !T->rchild)
        p = NULL;
    else if (!T->lchild) {
        q = T;
        T = T->rchild;
        free(T);
    }
    else if (!T->rchild) {
        q = T;
        T = T->lchild;
        free(T);
    }
    else {
        q = T;
        s = T->lchild;
        while (s->rchild) {
            q = s;
            s = s->rchild;
        }
        T->data = s->data;
        if (q != T)                /* 判断是否执行上述while循环 */
            q->rchild = s->lchild;    /* 执行上述while循环,重接右子树 */
        else
            q->lchild = s->lchild;    /* 未执行上述while循环,重接左子树 */
        free(s);

        }
    //n--;
    return 1;
    }
void InOrder(BiTree bt)
{//树的中序遍历
    if (!bt)
        return;

    InOrder(bt->lchild);
    printf("%d ", bt->data);
    InOrder(bt->rchild);
}
int main(){
    BiTree bt;
    int n, k;
    printf("输入数字的个数:");
    scanf("%d", &n);
    printf("请输入每个数字:");
    InitTree(bt, n);
    printf("中序遍历结果为:");
    InOrder(bt);
    putchar('\n');
    printf("请输入查找的关键字:");
    scanf("%d", &key);
    Search(bt, key);
    printf("请输入删除的关键字:");
    scanf("%d", &key);
    Delete_BiTree(bt, key);
    printf("请输入要插入的数据:");
    scanf("%d", &key);
    Insert(bt, key);
    printf("插入成功.\n");
    printf("中序遍历结果为:");
    InOrder(bt);
    putchar('\n');
    }
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值