《征服数据结构》树堆(Treap)

摘要:

1,Treap的介绍

2,Treap节点的插入

3,Treap节点的删除

4,Treap和笛卡尔树的区别

1,Treap的介绍

Treap又叫树堆,属于一种自平衡二叉搜索树,是由单词Tree和Heap构成,是一种具有二叉搜索树和堆两种数据结构的特性。在前面我们讲过《笛卡尔树》,它也是一种具有二叉搜索树和堆的两种数据结构的特性,关于它俩的区别我们后面在介绍。

我们知道如果随机使用一组数据创建二叉搜索树,则二叉搜索树很可能会退化成一个链表,增加了操作的时间复杂度。这个时候我们可以给每个节点随机生成一个优先级,这个优先级要满足堆的特性。因为是随机生成的,所以从概率上来说退化成链表的可能性就非常小。

Treap在节点插入和删除的时候也会进行旋转,因为它不是高度平衡的,所以Treap比我们前面讲的《AVL树》要简单很多,在讲解之前我们先来看下Treap的节点类。

Java 代码:

go 复制代码
class TreapNode {
    int key, priority;
    TreapNode left, right;

    public TreapNode(int key) {
        this.key = key;
        // 节点优先级,满足堆的特性,随机生成的
        this.priority = new Random().nextInt();
        this.left = this.right = null;
    }
}

C++ 代码:

go 复制代码
struct TreapNode {
    int key, priority;
    TreapNode *left = nullptr;
    TreapNode *right = nullptr;

    // 节点优先级priority,满足堆的特性,随机生成的
    TreapNode(int key) : key(key), priority(rand()) {}
};

节点类中有一个优先级priority,它是随机生成的,要满足堆的特性,这里我们使用最大堆,堆顶元素是优先级最高的。

再来看下节点的旋转,旋转不会改变二叉搜索树的特性,但会改变堆的特性,旋转的目的就是把优先级高的节点往上调整,优先级低的节点往下调整,这和我们前面讲的《数据结构堆》类似,不过在堆中是直接交换,不是通过旋转。

相关推荐
周杰伦_Jay1 小时前
【Python后端API开发对比】FastAPI、主流框架Flask、Django REST Framework(DRF)及高性能框架Tornado
数据结构·人工智能·python·django·flask·fastapi·tornado
yuuki2332338 小时前
【数据结构】用顺序表实现通讯录
c语言·数据结构·后端
还是码字踏实9 小时前
基础数据结构之数组的双指针技巧之对撞指针(两端向中间):三数之和(LeetCode 15 中等题)
数据结构·算法·leetcode·双指针·对撞指针
抠脚学代码13 小时前
Linux开发-->驱动开发-->字符设备驱动框架
linux·数据结构·驱动开发
橘颂TA17 小时前
【剑斩OFFER】算法的暴力美学——串联所有单词的字串
数据结构·算法·c/c++
葵续浅笑18 小时前
LeetCode - 杨辉三角 / 二叉树的最大深度
java·数据结构·算法·leetcode
Miraitowa_cheems18 小时前
LeetCode算法日记 - Day 94: 最长的斐波那契子序列的长度
java·数据结构·算法·leetcode·深度优先·动态规划
Paxon Zhang21 小时前
数据结构之**二叉树**超全秘籍宝典2
java·数据结构·算法
迷途之人不知返1 天前
链表相关的算法题(2)
数据结构·算法·链表
nju_spy1 天前
力扣每日一题(四)线段树 + 树状数组 + 差分
数据结构·python·算法·leetcode·面试·线段树·笔试