//
// main.cpp
// 数列构建笛卡尔树
//
#include <iostream>
using namespace std;
/*
35
/ \
16 27
/ \ / \
12 15 19 18
12 16 15 35 19 27 18
*/
/*
栈中的情况变化 是下标在栈中,用值表示易理解
| | | | | | | | | | | | | |
| | | | | | | | | | | | | |
| | | | | | | | | | | | | |
| | | | | | | | | | | | |18 |<-top
| | | | |15 |<-top|15 | |19 |<-top|27 |<-top|27 |
|12 |<-top|16 |<-top|16 | |35 |<-top|35 | |35 | |35 |
|___| |___| |___| |___| |___| |___| |___|
*/
//代码摘自笛卡尔树百度百科,
const int MAXN=100;
void computeTree(int A[MAXN], int N, int T[MAXN])
//T[i]储存每个结点的父结点(左右子树是无所谓的)
{
int st[MAXN], i, k, top = -1;
//从空栈开始
//第i步,我们将A[i]插入栈中
for (i = 0; i < N; i++)
{
//找到第一个大于等于A[i]的元素
k = top;
while (k >= 0 && A[st[k]] < A[i]) k--; //最大堆 如果是最小堆应该是 >
//如上述,更改树的结构
if (k != -1) T[i] = st[k];
if (k < top) T[st[k + 1]] = i;
//将A[i]插入栈中,并移除所有更大的元素
st[++k] = i;
top = k;//这里是令k为top,其实35上面还有数字15,只是top是35而已,下一回15就会被19覆盖了
}
//栈中的第一个元素就是树根,没有父节点
T[st[0]] = -1;
}
int main()
{
int A[MAXN]={12,16,15,35,19,27,18};
int T[MAXN];
computeTree(A, 7, T);
for(int i=0; i<7; ++i)
cout<<T[i]<<" ";
return 0;
}
//1 3 1 -1 5 3 5 Program ended with exit code: 0
笛卡尔树构建
最新推荐文章于 2024-05-16 13:36:28 发布