7-31 笛卡尔树 (25 分)

二叉搜索树的判断方式和小根堆的判断方式

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int N = 1005;
int ind[N];
struct DescartesTree{
	int k1, k2, l, r;
}E[N];
bool judge(int r, int maxx, int minn){
	if(r == -1) return true;
	int k1 = E[r].k1, k2 = E[r].k2;
	if(k1 >= maxx || k1 <= minn) return false;
	if(E[r].l != -1) {
		int ll = E[r].l;
		if(E[ll].k2 <= k2) return false;
	}
	if(E[r].r != -1){
		int rr = E[r].r;
		if(E[rr].k2 <= k2) return false;
	}
	return judge(E[r].l, k1, minn) && judge(E[r].r, maxx, k1);
}
int main(){
	int n;
	scanf("%d", &n);
	for(int i = 0; i < n; i++){
		scanf("%d %d %d %d",&E[i].k1, &E[i].k2, &E[i].l, &E[i].r);
		if(E[i].l != -1) ind[E[i].l]++;
		if(E[i].r != -1) ind[E[i].r]++;
	}
	int root;
	for(int i = 0; i < n; i++){
		if(!ind[i]){
			root = i;
			break;
		}
	}
	if(judge(root, INT_MAX, INT_MIN)) cout<<"YES"<<endl;
	else cout<<"NO"<<endl;
	return 0;
} 

你可能感兴趣的:(数据结构与算法题目集,堆排序,Tree)