•笛卡尔树是一种同时满足二叉搜索树和堆的性质的数据结构。可在一个数组上构造出来(时间复杂度可以达到O(n))。树中节点有几个属性, key(节点元素的大小)、index(节点在原数组中的索引)、left(左子节点)、right(右子节点)、parent(父节点)。
性质
1.
树中的元素满足二叉搜索树性质,要求按照中序遍历得到的序列为原数组序列
2.
树中节点满足堆性质,节点的
key
值要大于其左右子节点的
key
值
写个数组模拟链表的模板
struct TreeNode
{
int index, key, value, father, left, right;
TreeNode() : index(0), key(0), value(0), father(0), left(0), right(0) {}
TreeNode(int index, int key, int value) :
index(index), key(key), value(value), father(0), left(0), right(0) {}
bool operator < (const TreeNode& rhs) const { return key < rhs.key; }
};
struct Cartesian_Tree
{
TreeNode node[MAXN];
Cartesian_Tree()
{
for (int i = 1;i <= MAXN;i++)
node[i] = TreeNode();
}
void build(int n)
{
stack<int> S;
sort(node + 1, node + n + 1);
while (!S.empty()) S.pop();
S.push(1);
for (int i = 2;i <= n;i++)
{
int temp;
while (!S.empty() && node[S.top()].value > node[i].value)
{
temp = S.top();
S.pop();
}
if (!S.empty())
{
node[i].father = S.top();
node[node[S.top()].right].father = i;
node[i].left = node[S.top()].right;
node[S.top()].right = i;
}
else
{
node[temp].father = i;
node[i].left = temp;
}
S.push(i);
}
}
};