C++ 笛卡尔树

news/2024/5/20 8:37:30 标签: c++, 笛卡尔树, , 二叉树

目录

    • 一、性质
    • 二、构建笛卡尔树
    • 三、应用
    • 四、源码

一、性质

  1. 性质: 笛卡尔树是一种满足性质的树。每个节点包含两个值:键值(key)和优先级值(priority)。在笛卡尔树中,根节点的优先级值最大,且每个节点的优先级值大于其子节点的优先级值。

  2. 中序遍历: 笛卡尔树的中序遍历结果与原始数组的顺序一致。这意味着,如果你将笛卡尔树按中序遍历的顺序输出,就会得到原始数组的顺序。

  3. 唯一性: 对于给定的键值数组,存在唯一的笛卡尔树与之对应。

在这里插入图片描述(备注:图源于 维基百科)

二、构建笛卡尔树

  1. 笛卡尔树通常是通过一个数组构建的,数组中的元素按照顺序表示树中节点的键值,另一个数组表示节点的优先级值。
  2. 通过递归的方式构建笛卡尔树:在给定数组范围内,找到优先级值最大的元素作为根节点,然后递归构建左子树和右子树。

三、应用

  1. 最小公共祖先(LCA): 通过构建笛卡尔树,可以在O(1)时间内找到任意两个节点的最小公共祖先。

  2. 区间最小值/最大值查询: 通过构建笛卡尔树,可以在O(log n)时间内查询给定区间的最小值或最大值。

四、源码

#include <iostream>
#include <vector>

using namespace std;

struct Node {
    int key;
    int priority;
    Node* left;
    Node* right;

    Node(int k, int p) : key(k), priority(p), left(nullptr), right(nullptr) {}
};

Node* buildCartesianTree(vector<int>& arr, vector<int>& priority, int start, int end) {
    if (start > end) {
        return nullptr;
    }

    int maxIndex = start;
    for (int i = start + 1; i <= end; i++) {
        if (priority[i] > priority[maxIndex]) {
            maxIndex = i;
        }
    }

    Node* root = new Node(arr[maxIndex], priority[maxIndex]);
    root->left = buildCartesianTree(arr, priority, start, maxIndex - 1);
    root->right = buildCartesianTree(arr, priority, maxIndex + 1, end);

    return root;
}

void inOrderTraversal(Node* root) {
    if (root) {
        inOrderTraversal(root->left);
        cout << "(" << root->key << ", " << root->priority << ") ";
        inOrderTraversal(root->right);
    }
}

int main() {
    vector<int> arr = { 9,3,7,1,8,12,10,20,15,18,5 };
    vector<int> priority = { 8,10,8,11,8,4,5,2,4,2,10 };

    Node* root = buildCartesianTree(arr, priority, 0, arr.size() - 1);

    cout << "Inorder traversal of Cartesian Tree: ";
    inOrderTraversal(root);
    cout << endl;

    return 0;
}


http://www.niftyadmin.cn/n/5434708.html

相关文章

数据资产管理之道:PDCA循环引领数字化转型

在数字化浪潮的推动下&#xff0c;数据已成为现代企业的核心竞争力。如何有效地管理这些宝贵的数据资产&#xff0c;确保它们为企业带来持续的竞争优势&#xff0c;成为许多企业迫切需要解决的问题。本文将基于PDCA循环&#xff0c;为您深入剖析如何构建稳健的数据资产管理流程…

零知识玩转AVH(8)—— 门槛任务(3)所遇错误及解决(2)

接前一篇文章&#xff1a;零知识玩转AVH&#xff08;7&#xff09;—— 门槛任务&#xff08;2&#xff09;所遇错误及解决&#xff08;1&#xff09; 上一回说到在尝试完成门槛任务 https://github.com/ArmDeveloperEcosystem/Paddle-examples-for-AVH &#xff08;推荐&#…

外卖点餐系统 |基于springboot框架+ Mysql+Java+JSP技术+Tomcat的外卖点餐系统 设计与实现(可运行源码+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 骑手功能模块 商家功能模块 管理员功能登录前台功能效果图 用户功能模块 系统功能设…

20240313金融读报:粮食产能提升行动方案与金融创新实践,聚焦科技创新链产业链融合及国际金融中心联动发展

1、新一轮千亿斤粮食产能提升行动方案&#xff08;2024&#xff0d;2030年&#xff09;&#xff1a;扎实推进藏粮于地、藏粮于技&#xff0c;落实分品种增产任务和分区域增产布局&#xff0c;谋划实施高标准农田建设、种业振兴等支撑性重大工程&#xff08;乡村振兴着力点&…

Redis 持久化-RDB

RDB&#xff08;Redis DataBase&#xff09;&#xff0c;在指定的时间间隔内将内存中的数据集快照写入磁盘&#xff0c;也就是行话讲的Snapshot快照&#xff0c;它恢复时是将快照文件直接读到内存里。 Redis会单独创建&#xff08;fork&#xff09;一个子进程来进行持久化&…

【C++】C++程序的文件组成

C程序通常由以下几个文件组成&#xff1a; 源文件&#xff08;.cpp或.c文件&#xff09;&#xff1a;这些文件包含程序的实现代码。主要逻辑和功能被定义在这些文件中。头文件&#xff08;.h或.hpp文件&#xff09;&#xff1a;这些文件包含了程序中使用的类、函数和变量的声明…

【bioinformation 9】RDKit

&#x1f31e;欢迎来到AI医学的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f4c6;首发时间&#xff1a;&#x1f339;2024年3月17日&am…

实现微服务:匹配系统

HTTP与WebSocket协议 1. HTTP协议是无状态的&#xff0c;每次请求都是独立的&#xff0c;服务器不会保存客户端的状态信息。而WebSocket协议是有状态的&#xff0c;一旦建立连接后&#xff0c;服务器和客户端可以进行双向通信&#xff0c;并且可以保持连接状态&#xff0c;服务…