搜索二叉树

搜索二叉树是一种严格执行“节点的值大于左子节点小于右子节点”这一规律的一种二叉树,而且其执行过程中是可以边插入边删除的。

但要注意,二叉搜索树中节点的左子树中所有节点的值都要小于该节点,同理,右子树中所有节点的值都要大于该节点。

下面是一种错误的搜索树:


因19大于祖先节点17

具体实现过程:

结构体:

typedef struct BinTree
{
    ElementType key;
    struct BinTree *left, *right;
}BinTree;

插入方法:

BinTree* Insert(BinTree *T, ElementType n)
{
    if(!T)
    {
        BinTree *K = (BinTree*)malloc(sizeof(BinTree));
        K->key = n;
        K->left = NULL;
        K->right = NULL;
    }
    
    if(T->key > n)
    {
        T->left = Insert(T->left, n);
    }
    else if(T->key < n)
    {
        T->right = Insert(T->right, n);
    }
    
    return K;
}

删除方法:

删除二叉搜索树节点时,要注意删除的这个二叉树节点的左右子树。

有:1、该节点为叶子节点 2、该节点非叶子节点,有一个孩子节点 3、该节点非叶子节点,有左右孩子       三种情况。

1、当该节点为叶子节点时,无孩子节点,该节点可直接删除,但要注意其父亲节点相应指针的指向

2、当该节点只有一个孩子节点时,使该节点指向其孩子节点的地址,并释放该节点地址。

3、当该节点有两个孩子节点时,可以取该节点左子树中最大的值替换该节点的值删除那个左子树中最大值的节点,也可以取该节点右子树中最小的节点值来替换该节点的值同理,是删除那个右子树中最小节点。

具体实现:

BinTree* Delete(ElementType n, BinTree* T)
{
    BinTree* mid = NULL;
    if(!T)//该节点不存在
    {
        printf("没有找到该节点!\n");
    }
    else if(T->key > n)//该节点的值大于目标节点,需要遍历左子树寻找
    {
        T->left = Delete(n, T->left);
    }
    else if(T->key < n)//该节点的值小于目标节点,需要遍历右子树寻找
    {
        T->right = Delete(n, T->right);
    }
    else//找到该节点位置,根据节点情况处理
    {
        if(T->left&& T->right)//当节点有左子树和右子树的时候
        {
            mid = FindMin(T->right);
            
            T->key = mid->key;
            T->right = Delete(mid->key, T->right);
        }
        else//当该节点仅有一个孩子或者没有孩子节点的时候
        {
            mid = T;
            if(!T->left)//T有右孩子或无孩子节点,此时其右子节点或为空或为非空。
            {
                T = T->right;
            }
            else if(!T->right)//T有左孩子
            {
                T = T->left;
            }
            free(mid);
        }
    }
    return T;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值