笛卡尔树(Cartesian Tree)

  笛卡尔树是一棵二叉树,树的每个节点有两个值,一个为index,一个为value。光看index的话,笛卡尔树是一棵二叉搜索树,每个节点的左子树的index都比它小,右子树都比它大;光看value的话,笛卡尔树有点类似堆,根节点的value是最小(或者最大)的,每个节点的value都比它的子树要小(或者大)。
  它可以处理范围最值查询、范围top k查询(range top k queries)等问题。
  
  如图就是一棵笛卡尔树(上方表格中每个数的编号为index,数值为value,下方是根据数据生成的笛卡尔树):
  
  直接构造的方法是排序以后再插入,这样就需要 O(nlog2n)O(n2) 的时间复杂度,而这花费的时间太多,因此我们要寻找一种更加便捷的方式处理:
  我们注意到这个树C的右链,即根结点、根结点的右儿子、根结点的右儿子的右儿子……组成的链,它们的index和value都是递增的,所以如果插入一个新的数a[i],比a[i]大的数都不会在右链中,在新树中会出现在a[i]的左子树里。根据这个原理,我们就可以设计一个栈来储存右链,每增加一个数从顶部处理一次即可。


参考资料:
1.笛卡尔树_百度百科
2.Cartesian tree - Wikipedia, the free encyclopedia

你可能感兴趣的:(OI)