7-31 笛卡尔树 (25 分)

笛卡尔树是一种特殊的二叉树,其结点包含两个关键字K1和K2。首先笛卡尔树是关于K1的二叉搜索树,即结点左子树的所有K1值都比该结点的K1值小,右子树则大。其次所有结点的K2关键字满足优先队列(不妨设为最小堆)的顺序要求,即该结点的K2值比其子树中所有结点的K2值小。给定一棵二叉树,请判断该树是否笛卡尔树。

输入格式:

输入首先给出正整数N(≤1000),为树中结点的个数。随后N行,每行给出一个结点的信息,包括:结点的K1值、K2值、左孩子结点编号、右孩子结点编号。设结点从0~(N-1)顺序编号。若某结点不存在孩子结点,则该位置给出−1。

输出格式:

输出YES如果该树是一棵笛卡尔树;否则输出NO

输入样例1:

6
8 27 5 1
9 40 -1 -1
10 20 0 3
12 21 -1 4
15 22 -1 -1
5 35 -1 -1

输出样例1:

YES

输入样例2:

6
8 27 5 1
9 40 -1 -1
10 20 0 3
12 11 -1 4
15 22 -1 -1
50 35 -1 -1

输出样例2:

NO

根节点比孩子结点都小的是小根堆,搜索二叉树是左孩子比根节点小,右孩子比根节点大,对部分对整体来说都是这样的。思路:首先根据给出的数组构建二叉树,然后小根堆的话比较好解决就是根节点小于两个结点的k2即可,搜索二叉树的话因为要保证整体的搜索二叉树的特性(也就是右子树的左孩子不能小于他根节点的值,对于左子树来说的话就是他的右孩子不能大于根节点的值),也就是每一个都这么判断,用一个值来记录他根节点的值,如果是右子树的话对他的左孩子加以限制,对于左子树的话就对他的右孩子加以限制,并不断重复这个判断过程,也就是递归。

#include <bits/stdc++.h>
using namespace std;
int a[1001][4];
int temp;//保留上一节点的值
bool flag=0;//用于提前跳出递归,减少不必要的递归
struct tree{int k1;int k2;tree *left;tree *right;
};
tree *creatree(int index){if(index==-1)return NULL;tree *t;t=new tree;t->k1=a[index][0];t->k2=a[index][1];t->left=creatree(a[index][2]);t->right=creatree(a[index][3]);return t;
}
void preorder(tree *t,int n){//n代表我这个当前的结点是上一结点的左孩子还是右孩子if(t==NULL||flag)return ;if(t->left!=NULL){if(t->k1<t->left->k1){//判断搜索二叉树,下面并列的if的同上printf("NO\n");flag=1;return ;}if(t->k2>t->left->k2){//小根堆printf("NO\n");flag=1;return ;}if(t->right!=NULL){//判断当前的右孩子是否大于上一结点的值if(temp<t->right->k1&&n==1){printf("NO\n");flag=1;return ;}}}if(t->right!=NULL){if(t->k1>t->right->k1){printf("NO\n");flag=1;return ;}if(t->k2>t->right->k2){printf("NO\n");flag=1;return ;}if(t->left!=NULL&&n==2){if(temp>t->left->k1){printf("NO\n");flag=1;return ;}}}temp=t->k1;preorder(t->left,1);//1为左孩子preorder(t->right,2);//2为右孩子
}
int main(){int n;scanf("%d",&n);int i;bool b[n];memset(b,1,sizeof(b));for(i=0;i<n;i++){scanf("%d%d%d%d",&a[i][0],&a[i][1],&a[i][2],&a[i][3]);if(a[i][2]!=-1)b[a[i][2]]=0;if(a[i][3]!=-1)b[a[i][3]]=0;}for(i=0;i<n;i++){if(b[i])break;}tree *t=NULL;t=creatree(i);temp=t->k1;preorder(t,0);//0为根节点if(flag==0)printf("YES");system("pause");
}

7-31 笛卡尔树 (25 分)相关推荐

  1. 笛卡尔树 (25 分)笛卡尔树是一种特殊的二叉树,其结点包含两个关键字K1和K2。首先笛卡尔树是关于K1的二叉搜索树,即结点左子树的所有K1值都比该结点的K1值小,右子树则大。其次所有结点的K2关键字

    立志用最少的代码做最高效的表达 笛卡尔树是一种特殊的二叉树,其结点包含两个关键字K1和K2.首先笛卡尔树是关于K1的二叉搜索树,即结点左子树的所有K1值都比该结点的K1值小,右子树则大.其次所有结点的 ...

  2. 【笛卡尔树】【线段树】meetings 会议(P5044)

    正题 P5044 题目大意 给出一个序列a,设 dist(x,y)=max⁡i=xyaidist(x,y)=\max_{i=x}^ya_idist(x,y)=maxi=xy​ai​,有m个询问,对于每 ...

  3. 「LOJ2474」「2018 集训队互测」北校门外的未来-笛卡尔树及其扩展+LCT

    Description 链接 Solution 对于一棵树 TTT,定义其的笛卡尔树 C(T)C(T)C(T) 满足: 堆性质,即祖先的权值(本题中为标号)一定大于子孙的权值. 搜索树性质,即任意子树 ...

  4. HDU - 6305 RMQ Similar Sequence(笛卡尔树)

    http://acm.hdu.edu.cn/showproblem.php?pid=6305 题目 对于A,B两个序列,任意的l,r,如果RMQ(A,l,r)=RMQ(B,l,r),B序列里的数为[0 ...

  5. [算法学习] 线段树,树状数组,数堆,笛卡尔树

    都是树的变种,用途不同 [线段树 Interval Tree] 区间管理,是一种平衡树 可看做是对一维数组的索引进行管理.一维数组不需要是排序好的 深度不超过logL 任一个区间(线段)都分成不超过2 ...

  6. 洛谷 - P4755 Beautiful Pair(笛卡尔树+主席树)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a,现在一个数对 ( i , j ) 如果满足 a[ i ] * a[ j ] <=max( a[ i ] ~ a[ j ] ),则称其 ...

  7. 牛客多校3 - Sort the Strings Revision(笛卡尔树+分治)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数字串 s[ 0 ],每个位置的赋值初始时为 s[ i ] = i % 10 ( i ∈ [ 0 , n - 1 ] ),现在有一个长度为 n 的排 ...

  8. 牛客 - sequence(笛卡尔树+线段树)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a 和数列 b ,求 题目分析:不算难的题目,对于每个 a[ i ] 求一下贡献然后维护最大值就好,具体思路就是,先找出每个 a[ i ] 左 ...

  9. POJ - 2559 Largest Rectangle in a Histogram(笛卡尔树,单调栈实现)

    题目链接:点击查看 题目大意:给出一排高度不同,宽度都为 1 的矩形,问拼起来后最大的矩形面积是多少 题目分析:普通做法是用单调栈直接维护,我一直觉得单调栈处理这种矩形问题都比较抽象,也可能是我太菜了 ...

最新文章

  1. [BUUCTF-pwn]——bjdctf_2020_babystack
  2. 推荐系统:MovivLens20M数据集解析
  3. python绑定内核_向Ipython添加python2内核
  4. 统计文章中字母出现频率
  5. 10本最火的中台与数字化转型图书,朋友圈都在传
  6. tf.Variable、tf.get_variable、tf.variable_scope、tf.name_scope、random、initializer
  7. linux 查看汉字编码方式
  8. 自定义ArcView-构造拓展性高的view
  9. C++代码实现 生成器模式
  10. interview-db
  11. dcp7080d怎么加墨粉_兄弟打印机DCP,7080D提示更换墨粉该怎么办?|7080D打印机
  12. 阿里中台搞了3年,凉了?网传:副总裁玄难“背锅”,辞职创业!咸鱼放弃维护 Flutter!...
  13. PAT乙级1068 万绿丛中一点红 (20 分)
  14. 费解的数字 递推+位运算
  15. mysql 是否支持Unix系统_在UNIX系统下安装MySQL
  16. 广州蓝景分享—前端开发JavaScript中的Array对象与其他数组
  17. 如何使用 ssh 建立 socks 代理
  18. JavaWeb---web
  19. 小米笔记本air 13.3 2018款参数
  20. 互联网人租房有多难?听完这6位的自白,瞬间破防了 ....

热门文章

  1. 【利用Arcpy快速检索矢量文件和栅格文件并进行统计和删除工作】
  2. Java重载hashcode_HashCode 作用,如何重载hashCode方法
  3. ISO15765-2 CAN 网络层协议介绍
  4. Struts1的路径映射详解
  5. android dialog 自定义布局,Android自定义Dialog实现加载对话框效果
  6. 滑雪问题(动态规划)——SHOI2002
  7. LaTex 希腊字母对照表
  8. 《GA-Net: Guided Aggregation Net for End-to-end Stereo Matching》
  9. DeepDB:Learn From Data,not from Queries 解读
  10. E0070——不允许使用不完整的类型和E3365——不允许使用不完整的类类型解决办法