【模板】笛卡尔树

笛卡尔树是一种同时满足二叉搜索树的性质的数据结构。可在一个数组上构造出来(时间复杂度可以达到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);
    	}  
	}  
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值