平衡树

 

一、二叉查找树

  简介

    二叉排序树或者是一棵空树,或者是具有下列性质的 二叉树
    (1)若左子树不空,则左子树上所有节点的值均小于它的 根节点的值;
    (2)若右子树不空,则右子树上所有节点的值均大于它的根节点的值;
    (3)左、右子树也分别为二叉排序树;
    (4)没有键值相等的节点。

  1.二叉查找树的遍历

    在二叉查找树中,从小到大输出结点的值,只需要对二叉树进行中序遍历

void Print(int u)
{
    if(!p[u].w) return;
    Print(p[u].lchild);
    printf("%d ",p[u].w);
    Print(p[u].rchild);
    //在二叉查找树中,从小到大输出结点的值,只需要对二叉树进行中序遍历
}

  2.二叉查找树的查找

    因为二叉查找树是有序的,所以要查找特定的值只需要二分查找即可,如果是非空结点,则查找成功,否则查找失败

int Find(int u)
{
    if(!p[u].w) return 0;
    if(p[u].w==find_x) return u;
    if(p[u].w<find_x) return Find(p[u].rchild);        
    if(p[u].w>find_x) return Find(p[u].lchild);
    //因为二叉查找树是有序的,所以要查找特定的值只需要二分查找即可,如果是非空结点,则查找成功,否则查找失败 
}

  3.二叉查找树查找最值

    找到以u为树根的权值最小的点,此点一定是u的递归操作下的左子树中的叶子结点 

int Find_Min(int u)
{
    if(!p[u].w) return 0;
    while(p[p[u].lchild].w) u=p[u].lchild;
    return u;//找到以u为树根的权值最小的点,此点一定是u的递归操作下的左子树中的叶子结点 
}

  4.二叉查找树中插入结点

    建立在查找的基础上,二分查找,注意的是可能有重复的点,这时候有两个解决方法

      ①插入到左子树中

      ②将结点打计数标记

    假如当前结点为空,建立新的结点,结点的值就是当前插入结点的值,生成左右空子树

void Insert(int u)
{
    if(!p[u].w) {p[u].w=insert_x,p[u].cnt++;} 
    if(p[u].w<find_x) return Insert(p[u].rchild);        
    if(p[u].w>find_x) return Insert(p[u].lchild);
    /*假如当前结点为空,建立新的结点,结点的值就是当前插入结点的值,生成左右空子树
    有重复的结点的话,打计数标记解决 */
} 

  5.二叉查找树中删除结点

    分三种情况讨论

      ①叶子结点

      ②链结点

      ③有两个非空子节点
    前面两个同样对待,用叶子结点代替本身,就等于用空节点代替,等同于删除

    对于第三种情况,删除结点u,要用右子树中最小的值代替

    

int Delete_Min(int u)
{
    if(!p[u].lchild) return u;
    else return Delete_Min(p[u].lchild);
    /*如果左子树为空,则直接用自己代替
    否则继续遍历左子树 */
}
void Delete(int u)
{
    if(p[u].w==delete_p)
    {
        if(p[u].cnt>1) {p[u].cnt--;return;}
        if(p[u].rchild&&p[u].lchild)
            p[u]=p[Delete_Min(p[u].rchild)];
        else p[u]=p[p[u].lchild+p[u].rchild];
        return;    
        /*找到值相同的节点,如果节点的cnt>1直接处理返回
        如果发现是链结点或者叶子结点,直接继承两个儿子的序列和的那一个节点
        假使是链节点的话,那么必定有一个结点为空,如果是叶子结点,都为空,就等同与删除了此叶子结点 */
    }    
    if(delete_p<p[u].lchild)  Delete(p[u].lchild);
    else Delete(p[u].rchild);    
} 

二、Treap

  1.Treap 旋转(Zig/Zag)

    左旋

    右旋

  2.Treap 插入(Insert)

  3.Treap 删除(erase)

  4.Treap 前驱(Pre)

  5.Treap 后继(next)

  6.Treap 排名(rank)

  7.Treap 第K大(sort)

三、相关转载于推荐文章(十分感谢这些博主)

 

 

 

转载于:https://www.cnblogs.com/SeanOcean/p/11297261.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
malloc lab平衡是一个在C语言中实现的数据结构,其目的是通过动态内存分配函数malloc来构建一个平衡二叉平衡,是指左右子的高度差最多为1的二叉排序。为了保持平衡,我们需要在插入和删除节点时进行相应的旋转操作。由于malloc函数的特性是分配一块连续的内存块,我们可以利用这一特性来构建平衡。 首先,我们需要定义一个节点结构体,其中包含左右子节点指针、键值和平衡因子等信息。然后,我们通过malloc函数动态分配一个节点并初始化,将其插入到平衡中。 在插入节点时,我们需要根据节点的键值和当前根节点的键值比较来确定插入的位置。如果键值小于当前节点的键值,则将其插入到当前节点的左子中;如果键值大于当前节点的键值,则将其插入到当前节点的右子中。然后,我们需要更新插入路径上各个节点的平衡因子,并进行相应的旋转操作来调整平衡性。 在删除节点时,我们也需要进行相应的旋转操作来保持平衡性。首先,我们需要找到要删除的节点,并进行删除操作。然后,我们需要根据删除路径上各个节点的平衡因子来进行旋转操作。 通过动态内存分配函数malloc,我们可以灵活地构建和调整平衡。但需要注意的是,使用malloc函数分配的内存需要在使用后进行释放,以避免内存泄漏问题。因此,在删除节点后,我们需要使用free函数释放相应的内存空间。 总而言之,malloc lab平衡是一种利用动态内存分配函数malloc来构建的平衡二叉,通过插入和删除节点,并进行相应的旋转操作来保持平衡性。这是一种高效的数据结构,可以在C语言中灵活地使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值