数据结构-查找二叉树(Binary Sort Tree)

树的递归理解起来需要花点时间;

关于查找二叉树的删除:

#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNode{
    int data;
    struct TreeNode *left;
    struct TreeNode *right;
}tree;
typedef tree *PtrToTree;
typedef PtrToTree SearchTree;

SearchTree create();
SearchTree insert(int x,tree *p);
SearchTree deletex(int x,tree *p);
SearchTree find(int x,tree *p);
SearchTree findmin(tree *p);
SearchTree findmax(tree *p);
void print(tree *put,int depth);
void list(tree *p,int depth);
int main()
{
    int x;
    tree *p,*max,*min;
    p = create();
    list(p,0);
    max = findmax(p);
    min = findmin(p);
    printf("max = %d min = %d\n",max->data,min->data);
    printf("need to delete data : \n");
    scanf("%d",&x);
    p = deletex(x,p);
    list(p,0);
    return 0;
}

SearchTree create()
{
    int x;
    tree *root = NULL;
    while(scanf("%d",&x)!=EOF)
        root = insert(x,root);
    return root;
}

SearchTree insert(int x,tree *p)
{
    if(p==NULL)
    {
        p = (tree *)malloc(sizeof(tree));
        p->data = x;
        p->left = NULL;
        p->right = NULL;
    }
    else if(x < p->data)
            p->left = insert(x,p->left);
    else if(x > p->data)
            p->right = insert(x,p->right);//无视数据相同的情况
    return p;
}
SearchTree deletex(int x,tree *p)
{
    tree *current;
    if(p==NULL)
        printf("not find\n");
    else if(x < p->data)
        p->left = deletex(x,p->left);
    else if(x > p->data)
        p->right = deletex(x,p->right);//寻找需要删除的节点
    else if(p->left && p->right)//当删除的节点存在左右子树时,
    {
        current = findmin(p->right);//找到节点右子数中最小的数据的节点
        p->data = current->data;//将找到的最小的数据赋给需要删除的节点
        p->right = deletex(current->data,p->right);//删除找到的最小数据那个节点,因为最小数据的节点不存在左儿子所以可以正常删除
    }
    else{//只存在单个儿子或不存在儿子时
        current = p;//current指向需要删除的节点
        if(p->left==NULL)
            p = p->right;
        else if(p->right==NULL)
            p = p->left;//存在左儿子则将左儿子赋给它,即让该节点的父亲指向该节点的儿子,存在右儿子也是如此
        free(current);//释放内存空间,完成删除
    }
    return p;
}

SearchTree find(int x,tree *p)
{
    if(p==NULL)
        return NULL;
    if(x < p->data)
        return find(x,p->left);
    else if(x > p->data)
        return find(x,p->right);
    else
        return p;
    return NULL;
}

SearchTree findmin(tree *p)
{
    if(p==NULL)
        return NULL;
    else if(p->left==NULL)
        return p;
    else
        return findmin(p->left);
}

SearchTree findmax(tree *p)
{
    if(p==NULL)
        return NULL;
    else if(p->right==NULL)
        return p;
    else
        return findmax(p->right);
}

void print(tree *put,int depth)//深度显示每一层多一个tab
{
    while(depth--)
    {
        printf("\t");
    }
    printf("%d\n",put->data);
}

void list(tree *p,int depth)//中序遍历,显示深度,由于BST性质,中序遍历一定是从小到大显示
{
    if(p!=NULL)
    {
        list(p->left,depth+1);
        print(p,depth);
        list(p->right,depth+1);
    }
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值