当前位置: 首页 > news >正文

笛卡尔树知识点+思路

笛卡尔树性质:

每个结点存储 (k,w) ,即一个序偶

  • 对于k而言,是一个二叉搜索树(满足条件:根节点大于左节点,小于右节点)

  • 对于w而言,是一个小根堆/大根堆(满足条件:根节点值小于/大于左,右节点值)

笛卡尔树不是平衡的

笛卡尔树的构建:

如何使一个数组->笛卡尔树?

单调栈O(n),处理出每一个结点的左儿子,右儿子,权值w

QQ_1755002624319

举例:对于上图的数组 a=[9, 3, 7, 1, 8, 12, 10, 20, 15, 18, 5],构建一颗小根堆笛卡尔树

显然序偶 (k,w) = (元素下标,元素大小)

我们使单调栈元素是单调递增

从左至右:显然元素下标是单调增的,所以为了满足二叉搜索树的条件,我们首先会把这个结点视为右结点(因为前面元素下标都比该结点小)

然后通过 维护的单调栈 判断这个结点是哪一个结点的右结点

  1. 如果单调栈为空,那么该结点是初始结点,不用判断左右结点情况

  2. 如果单调栈非空:

若栈顶元素大小大于该元素大小,由于我们需要维护小根堆,显然当前结点不能是栈顶结点的儿子。直接出栈

若栈顶元素大小小于该元素大小,那么我们直接把当前结点看作栈顶结点的右结点

同时,我们需要维护出栈的最后一个元素结点,我们将该元素结点看作当前结点的左结点(元素大小既大于当前结点,元素下标又小于当前结点)

特别的,如果不断出栈,最后栈为空,说明当前结点看作根结点

最后将当前结点入栈

参考代码

struct node{int l=0,r=0,fa=0;int val;
};int n;cin>>n;vector<int>a(n+1);rep(i,1,n)cin>>a[i];vector<node>tr(n+1);stack<int>stk;rep(i,1,n){int L=0,R=0;while(stk.size()&&a[stk.top()]>a[i]){L=stk.top();stk.pop();}if(L!=0){tr[L].fa=i;if(stk.size())tr[stk.top()].r=i;}else if(stk.size()){tr[stk.top()].r=i;}stk.push(i);tr[i].val=a[i];tr[i].l=L;tr[i].r=R;}
http://www.sczhlp.com/news/10683/

相关文章:

  • Pass 和 Shader的关系
  • 二期鸡熏
  • root密码忘记解决办法
  • 【2025牛客暑期多校训练营9】L Ping Pong
  • 禁止废话
  • 2025.8.12总结 - A
  • 如何优化NebulaGraph的查询性能?
  • nim语言配置nimcache编译缓存
  • 20250811 做题记录
  • 20250812 做题记录
  • [PaperReading] RT-1: ROBOTICS TRANSFORMER FOR REAL-WORLD CONTROL AT SCALE
  • 【03】厦门立林科技——立林科技 嵌入式 校招笔试,题目记录及解析 - 指南
  • JAX快速上手:从NumPy到GPU加速的Python高性能计算库入门教程
  • 数组打印的全量显示设置
  • 8.11总结
  • 8.12总结
  • 2025.08.12 NK9
  • 带修主席树模板
  • 《烛之武退秦师》
  • Admin.NET站在巨人肩膀上的 .NET 通用权限开发框架
  • nebulagraph 查询IO下推总结
  • base_test中的task A,在用例中也写上一个task A,但是这个task A在base_test中调用,实际执行的是用例中的task A,还是base test中的task A
  • LeetCode 面试经典 150_数组/字符串_O(1)时间插入、删除和获取随机元素(12_380_C++_中等)(哈希表) - 教程
  • youwiki大佬的博文
  • 数字化转型别再堆工具了!这款项目管理软件才是破局关键
  • 20250812
  • 数据结构复习第一天(2025/8/12)
  • FWT小记
  • 数字孪生技术是如何在智慧园区领域稳步发展的?
  • 软工8.12