PTA数据结构与算法题目集(中文)  7-31

7-31 笛卡尔树 (25 分)
 

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

输入格式:

输入首先给出正整数N(≤1000),为树中结点的个数。随后N行,每行给出一个结点的信息,包括:结点的K1值、K2值、左孩子结点编号、右孩子结点编号。设结点从0~(N-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
题目分析:一道树的应用题 主要考察的是 对平衡二叉树定义 以及 优先队列(最小堆)定义的理解 对平衡二叉树判断时要注意 不仅要满足每个子树比左边小比右边大 整体树也要满足平衡二叉树的概念
 #define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<malloc.h> struct TreeNode
{
int K1;
int K2;
int Lc;
int Rc;
}Tr[]; int Collected[]; int FindTree(int N)
{
for (int i = ; i < N; i++)
if (!Collected[i])
return i;
} int IsAVL(int Tree)
{
if (Tree ==-)
return ;
else
{
if (Tr[Tree].Lc != - && Tr[Tree].Rc != -)
if (Tr[Tree].K1 >=Tr[Tr[Tree].Lc].K1 && Tr[Tree].K1 < Tr[Tr[Tree].Rc].K1)
return IsAVL(Tr[Tree].Lc) && IsAVL(Tr[Tree].Rc);
else
return ;
else if (Tr[Tree].Lc == - && Tr[Tree].Rc == -)
return ;
else if (Tr[Tree].Lc == -)
return Tr[Tree].K1 < Tr[Tr[Tree].Rc].K1;
else
return Tr[Tree].K1 >=Tr[Tr[Tree].Lc].K1; }
} int IsMinHeap(int Tree)
{
if (Tree ==-)
return ;
else
{
if (Tr[Tree].Lc != - && Tr[Tree].Rc != -)
if (Tr[Tree].K2 <=Tr[Tr[Tree].Lc].K2 && Tr[Tree].K2 <=Tr[Tr[Tree].Rc].K2)
return IsMinHeap(Tr[Tree].Lc) && IsMinHeap(Tr[Tree].Rc);
else
return ;
else if (Tr[Tree].Lc == - && Tr[Tree].Rc == -)
return ;
else if (Tr[Tree].Lc == -)
return Tr[Tree].K2 <=Tr[Tr[Tree].Rc].K2;
else
return Tr[Tree].K2 <=Tr[Tr[Tree].Lc].K2;
}
}
int JudgetLeft(int Tree, int T);
int JudgetRight(int Tree, int T); int JudgetLeft(int Tree,int T)
{
if (T == - || Tree == -)
return ;
if (Tr[Tree].K1 > Tr[T].K1)
return JudgetLeft(Tree, Tr[T].Lc) && JudgetLeft(Tree,Tr[T].Rc);
else
return ;
} int JudgetRight(int Tree, int T)
{
if (T == - || Tree == -)
return ;
if (Tr[Tree].K1 < Tr[T].K1)
return JudgetRight(Tree, Tr[T].Lc) && JudgetRight(Tree, Tr[T].Rc);
else
return ;
} int IsTree(int Tree)
{
if (Tree == -)
return ;
if(JudgetLeft(Tree,Tr[Tree].Lc)&&JudgetRight(Tree,Tr[Tree].Rc))
return IsTree(Tr[Tree].Lc)&&IsTree(Tr[Tree].Rc);
else
return ;
} int main()
{
int N;
scanf("%d", &N);
for (int i = ; i < N; i++)
{
int K1, K2, Lc, Rc;
scanf("%d%d%d%d", &K1, &K2, &Lc, &Rc);
Tr[i].K1 = K1;
Tr[i].K2 = K2;
Tr[i].Lc = Lc;
Tr[i].Rc = Rc;
if (Lc != -)
Collected[Lc] = ;
if (Rc != -)
Collected[Rc] = ;
}
int Tree = FindTree(N);
if (IsAVL(Tree) && IsMinHeap(Tree)&&IsTree(Tree))
printf("YES");
else
printf("NO");
return ;
}

PTA数据结构与算法题目集(中文) 7-31的更多相关文章

  1. PTA数据结构与算法题目集(中文) 7-43字符串关键字的散列映射 (25 分)

    PTA数据结构与算法题目集(中文)  7-43字符串关键字的散列映射 (25 分) 7-43 字符串关键字的散列映射 (25 分)   给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义 ...

  2. PTA数据结构与算法题目集(中文) 7-42整型关键字的散列映射 (25 分)

    PTA数据结构与算法题目集(中文)  7-42整型关键字的散列映射 (25 分) 7-42 整型关键字的散列映射 (25 分)   给定一系列整型关键字和素数P,用除留余数法定义的散列函数将关键字映射 ...

  3. PTA数据结构与算法题目集(中文) 7-41PAT排名汇总 (25 分)

    PTA数据结构与算法题目集(中文)  7-41PAT排名汇总 (25 分) 7-41 PAT排名汇总 (25 分)   计算机程序设计能力考试(Programming Ability Test,简称P ...

  4. PTA数据结构与算法题目集(中文) 7-40奥运排行榜 (25 分)

    PTA数据结构与算法题目集(中文)  7-40奥运排行榜 (25 分) 7-40 奥运排行榜 (25 分)   每年奥运会各大媒体都会公布一个排行榜,但是细心的读者发现,不同国家的排行榜略有不同.比如 ...

  5. PTA数据结构与算法题目集(中文) 7-39魔法优惠券 (25 分)

    PTA数据结构与算法题目集(中文)  7-39魔法优惠券 (25 分) 7-39 魔法优惠券 (25 分)   在火星上有个魔法商店,提供魔法优惠券.每个优惠劵上印有一个整数面值K,表示若你在购买某商 ...

  6. PTA数据结构与算法题目集(中文) 7-38寻找大富翁 (25 分)

    PTA数据结构与算法题目集(中文)  7-38寻找大富翁 (25 分) 7-38 寻找大富翁 (25 分)   胡润研究院的调查显示,截至2017年底,中国个人资产超过1亿元的高净值人群达15万人.假 ...

  7. PTA数据结构与算法题目集(中文) 7-37 模拟EXCEL排序 (25 分)

    PTA数据结构与算法题目集(中文)  7-37 模拟EXCEL排序 (25 分) 7-37 模拟EXCEL排序 (25 分)   Excel可以对一组纪录按任意指定列排序.现请编写程序实现类似功能. ...

  8. PTA数据结构与算法题目集(中文) 7-36 社交网络图中结点的“重要性”计算 (30 分)

    PTA数据结构与算法题目集(中文)  7-36 社交网络图中结点的“重要性”计算 (30 分) 7-36 社交网络图中结点的“重要性”计算 (30 分)   在社交网络中,个人或单位(结点)之间通过某 ...

  9. PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分)

    PTA数据结构与算法题目集(中文)  7-35 城市间紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市 ...

  10. PTA数据结构与算法题目集(中文) 7-34

    PTA数据结构与算法题目集(中文)  7-34 7-34 任务调度的合理性 (25 分)   假定一个工程项目由一组子任务构成,子任务之间有的可以并行执行,有的必须在完成了其它一些子任务后才能执行.“ ...

随机推荐

  1. swoole websocket_server 聊天室--群聊

    centos7  php7.2 swoole4.3 nginx1.8 websocket_server 代码 <?php $server = new Swoole\WebSocket\Serve ...

  2. DIY 作品 及 维修 不定时更新

    手机电池DIY充电宝 2块,优质手机电池加一个升压ic ,焊上一个 usb 母头.比买的强多了. 还能调压,最高调到24V 可以带白光焊台. 更换手机 SIM/SD 卡二合一 贴上高温胶带,吹下来. ...

  3. office一直提示配置进度与图标问题

    原来安装了wps office,广告太烦,于是卸载了wps安装Microsoft office 2010,安装完成后每次打开excel文件都要重新安装配置,修改注册表norereg和设置兼容模式都不行 ...

  4. 浏览器的重绘与回流(Reflow & Repaint)介绍

    重绘 当页面元素样式改变不影响元素在文档流中的位置时(如background-color,border-color,visibility),浏览器只会将新样式赋予元素并进行重新绘制操作. 回流 当改变 ...

  5. .NET 开发工具盘点和现状

    在这里我盘点一下.NET的开发工具:Visual Studio.Jetbrains Rider.Mono Develop.SharpDevelop.QuickSharp.Visual Studio C ...

  6. 今天开dev的时候,config update一下别人的,但是忘了自己改过目录了,导致光看ip,想了半天,为什么接口不对

    今天开dev的时候,config update一下别人的,但是忘了自己改过目录了,导致光看ip,想了半天,为什么接口不对 baseUrl: {     //     // dev: 'http://1 ...

  7. 异步编程RxJava-介绍

    前言前段时间写了一篇对协程的一些理解,里面提到了不管是协程还是callback,本质上其实提供的是一种异步无阻塞的编程模式:并且介绍了java中对异步无阻赛这种编程模式的支持,主要提到了Future和 ...

  8. [vue ]滚动视图解决ElementUI NavMenu 导航菜单过长显示的问题

    记录一下工作 需求 导航菜单过长的时候会溢出,需要一个像 Tabs 标签页一样的滚动视图容器,可以左右滚动内部视图. 解决方法 由于时间问题,所以直接将 Tabs 源码抽取出来使用. 这里要做一些特殊 ...

  9. 【Weiss】【第03章】练习3.25:数组模拟队列

    [练习3.25] 编写实现队列的例程,使用 a.链表 b.数组 Answer: 在这章一开头就已经写了个链表的队列例程了,所以实际上只要做b小题就可以. 数组模拟队列和链表的两点小不同是: ①.数组空 ...

  10. 洛古 P1312 Mayan游戏(dfs+剪枝)

    题目链接 这道题和俄罗斯方块很像 很明显,我们可以看出这是一个dfs,但是,我们需要几条剪枝: 1.如果只剩下1个或2个同样颜色的方块,那么直接退出 2.相同的块不用交换 3.注意优先性,优先左边换右 ...