笛卡尔树

来源:互联网 发布:zte中兴网络机顶盒密码 编辑:程序博客网 时间:2024/04/29 03:26

性质

二叉树,其中的每一个点是整棵树的极值,且每一棵树的中序遍历是原数组的一段。
详见下图:
详解

建树方法

每次加入到树的最右节点,若不符合其规范,沿着右边那一条链向上找,将它插入到恰好符合的那一个点的左节点,并且将那一段不符合的点加入到新加入点的右子树,并且更新右边那一条链。
例题

代码

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;            }        }
原创粉丝点击