题目链接:PTA | 程序设计类实验辅助教学平台

输入样例:
5
2 4 1 3 0
8
2 is the root
1 and 4 are siblings
3 and 0 are on the same level
2 is the parent of 4
3 is the left child of 4
1 is the right child of 2
4 and 0 are on the same level
100 is the right child of 3
输出样例:
Yes
Yes
Yes
Yes
Yes
No
No
No
分析:先说这道题目思路,后说一些细节,这是一道思路不难细节巨多的一道题目。
分析:先看看题目中的询问,问某点是否为根,根肯定是第一个插入的数,所以这个询问比较容易处理,下一个是A和B是否为兄弟节点,这个我们可以在建树时加上一个记录父亲节点的数组,让每个点的父亲节点被记录下来,这样判断询问的时候直接判断两个节点的父亲节点是不是一个节点就可以了,而下面一个询问更为直接,直接询问父亲节点,所以直接用父亲节点数组判断即可。接下来两个询问分别是判断A是B的左孩子还是右孩子,这个我们在建树过程中是肯定要存下来的,因为我们建树是一个递归过程,而向下递归就是向左儿子或者右儿子递归实现的,所以左右孩子数组肯定是要记录下来的,最后一个是判断A和B是否在同一层上,这个我们可以写一个单独的函数进行搜索某个节点的层数,然后分别对两个节点调用函数直接判断即可。
上面就是这道题的思路了,思路是比较简单的,主要是一些细节方面的处理:
第一个:读入问题
问题的格式非常难处理,我一开始就真的直接一个字符一个字符来判断,这样会使读入变得极其复杂,其实在string里面有一个find函数,就是查找变量里面是否含有某个字串的,所以我们只需要找到这些询问之间的不同点然后直接进行逐个判断即可,读入的时候用getline直接读入一行,然后分别判断属于哪个询问即可。举个简单的例子:如果子串中含有root,那么一定是询问A是否为树的根,这个时候我们就可以用s.find("root")!=s.npos来进行判断,如果s串中不含有“root”这个字串就会返回s.npos,否则就会返回找到的“root”的位置(注意下标从0开始)

本文解析了一道PTA程序设计实验题,通过构建二叉树并使用字符串处理技巧,实现了对各种父子节点关系及层级关系的判断。介绍了如何使用find函数和sscanf简化字符串读取。
最低0.47元/天 解锁文章
283

被折叠的 条评论
为什么被折叠?



