16 - 12 - 31 二叉排序树

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int KeyType;
typedef struct 
{
    KeyType key;
};
typedef struct Node
{
    DataType data;
    struct Node *lchild,rchild;
}BTNode,*BiTree;

/* 查找函数*/
BiTree BSTSearch(BiTree T,DataType x)
{
    BTNode *p;
    if(T){
        p = T;
        while(p)
        {
            if(p->data.key == x.key)
                return p;
            else if (x.key < p->data.key)
            {
                p = p->lchild;
            }
            else p = p->rchild;
        }
    }
    return NULL;
}

/* 插入操作 */
int BSTInsert(BiTree *T,DataType x)
{
    BTNode *p,*cur = *T,*parent = NULL ;
    while(cur)
    {
        if(cur->data.key == x.key) return 0;
                //函数返回0,说明根节点就是所要找的。
        parent = cur;  // 
        if( x.key < cur->data.key )
            cur = cur->lchild;
        else
            cur = cur->rchild;
    }
    p = (BTNode*)malloc(sizeof(BTNode));
    if(p)  exit(-1);
    p->data = x;
    p->lchild = NULL;   //上下三条语句:初始化一个待插入结点。
    p->rchild = NULL;
    if(!parent)  *T = p;  //是空树
    else if( x.key < parent->data.key )
        parent->lchild = p;
    else
        parent->rchild = p;
    return 1;  //成功插入
}

/* 删除操作 */
int BSTDelete(BiTree *T,DataType x)
{
    if(!T)  return 0;  
    if( x.key == (*T)->data.key )
        DeleteNode(T);
    else if( (*T)->data.key > x.key)
        BSTDelete((*T)->lchild);
    else
        BSTDelete((*T)->rchild);
    return 1;
}

void DeleteNode(BiTree *s)
{
    BiTree q,x,y;
    if( !(*S)->rchild ){   //1、
        q = *s;
        *s = (*s)->lchild;
        free(q);
    }  //当s没有右子树,直接接上左子树啦~
       //↑ 这个也包括了s 是叶子的情况
    else if( !(*s)->lchild ){
        q = *s;
        *s = (*s)->rchild;
        free(q);
    }else{
        x = *s;
        y = (*s)->lchild;

        while(y->rchild){
            x = y;
            y = y->rchild;
        }
        (*s)->data = y->data;
        if(x != *s)
            x->rchild = y->lchild;
        else
            x->lchild = y->lchild;
        free(y);
    }
}

关于删除的讲解 ↓


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值