性质
二叉树,其中的每一个点是整棵树的极值,且每一棵树的中序遍历是原数组的一段。
详见下图:
建树方法
每次加入到树的最右节点,若不符合其规范,沿着右边那一条链向上找,将它插入到恰好符合的那一个点的左节点,并且将那一段不符合的点加入到新加入点的右子树,并且更新右边那一条链。
例题
代码
scanf("%d",&n);
for(i=1;i<=n;i++)
{
tree[i].lef=tree[i].rig=-1;
scanf("%d",&num[i]);
}
now=1;
gen=1;
fa[1]=-1;
for(i=2;i<=n;i++)
{
k=now;
while(num[i]<num[k]&&k!=-1)
{
k=fa[k];
}
if(k==-1)
{
tree[i].lef=gen;
fa[gen]=i;
fa[i]=-1;
now=gen=i;
}
else
{
tree[i].lef=tree[k].rig;
tree[k].rig=i;
now=i;
fa[i]=k;
}
}