二叉排序树的创建

最最最需要注意的就是二级指针的运用

#include <bits/stdc++.h>
using namespace std;

enum Status {False,Success};
//定义树的数据类型
typedef int Type;
typedef struct Tree{
    Type data;
    struct Tree *lchild, *rchild;
}Tree;

//先序遍历

void Ergodic(Tree *T)
{
    if (T)
    {
        Ergodic(T->lchild);
        cout << T->data << " ";
        Ergodic(T->rchild);
    }
}

Status SearchTree(Tree *T, Type key, Tree *f, Tree **p)
{
    //没找到
    if (!T)   
    {
        *p = f;
        return False;
    }
    else if (T->data == key)
    {
        *p = T;
        return Success;
    }
    else if (T->data > key)
    {
        SearchTree(T->lchild, key, T, p);
    }
    else
        SearchTree(T->rchild, key, T, p);
};

Status InsertTree(Tree **T,Type key)
{
    Tree *p = NULL;
    Tree *s;
    if (!SearchTree(*T, key, NULL, &p))
    {
        s = (Tree *)malloc(sizeof(Tree));
        s->data = key;
        s->lchild = NULL;
        s->rchild = NULL;
        cout << key << endl;
        if (!p)
            *T = s;
        else if (p->data > key)
            p->lchild = s;
        else
            p->rchild = s;
    }
    else
        return False;
    return Success;
}

Status Delete(Tree **T, Tree *f)
{
    Tree *p = NULL;
    Tree *s = NULL;
    //左子树为空,接右子树
    if (!(*T)->lchild)
    {
        p = *T;
        f->lchild = (*T)->rchild;
        free(p);
    }
    //右子树为空,接左子树
    else if (!(*T)->rchild)
    {
        p = *T;
        f->lchild = (*T)->lchild;
        free(p);
    }
    //左右子树均不为空
    else
    {
        p = *T;
        s = (*T)->lchild;
        while (s->rchild)
        {
            p = s;
            s = s->rchild;
        }
        (*T)->data = s->data;
        if (p == *T)
        {
            p->lchild = s->lchild;
            free(s);
        }
        else
        {
            p->rchild = s->lchild;
            free(s);
        }
    }
    return Success;
}

Status DeleteTree(Tree **T,int key,Tree *f)
{
    if (!(*T))
        return False;
    else  if ((*T)->data == key)
    {
        Delete(T,f);
        return Success;
    }
    else if ((*T)->data > key)
        DeleteTree(&((*T)->lchild),key,*T);
    else
        DeleteTree(&((*T)->rchild), key, *T);
}


int main()
{
    int key;
    int val;
    cin >> key;
    int a[10] = { 62,88,58,47,35,73,51,99,37,93 };
    Tree *T = NULL;
    for (int i = 0; i < 10; i++)
    {
        val = InsertTree(&T, a[i]);
    }
    Ergodic(T);
    DeleteTree(&T,key,NULL);
    Ergodic(T);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值