
PAT甲级 树与二叉树
PAT甲级中遇到的树的处理问题
爱吃梦龙雪糕
这个作者很懒,什么都没留下…
展开
-
7-4 Structure of a Binary Tree (30 分)
2019年pat春季第四题本题考察知识点有,树的重建,字符串处理,查找结点对应指正,查找树中结点的父节点,判断树的结点的深度,判断树是否为满树(除叶结点外都有左右子树)。**#include<bits/stdc++.h>using namespace std;int n,m;int post[35],in[35];bool flag=true;struct Node{ int data,level,father; Node* lchild; Node* r原创 2021-09-10 21:00:02 · 92 阅读 · 0 评论 -
1020 Tree Traversals (25 分)
考察树的遍历,本题为已知后序遍历和中序遍历求层序遍历坑点如下1,层序遍历的生成方式,其参数为node型变量的地址,实际求时为根结点地址,生成一个队列,其中装有结构体型的地址,将根地址送入队列,之后进入循环,将队列开头输出并将其左右子树压入队列;void layerorder(node* root){ queue<node*>q; q.push(root); while(!q.empty()){ node* now=q.front(); q.原创 2021-08-05 17:11:10 · 86 阅读 · 0 评论 -
1043 Is It a Binary Search Tree (25 分)
本题考点有,二叉搜索树的生成,先序遍历方法,镜像树的先序遍历,后序遍历,镜像树的后序遍历坑点如下1,学会通过一串序列生成相应的二叉搜索树,代码如下空函数,参数为结构体类型,根结点指针地址,循环边界为指针不指向任何元素,使得指针指向一个新结点,赋值,将结点指向的左右子树置空。之后按条件递归void insert(Node* &root,int data){ if(root==NULL){ root=new Node; root->data=dat原创 2021-08-08 09:55:05 · 73 阅读 · 0 评论 -
1064 Complete Binary Search Tree (30 分)
本题考察完全二叉搜索树的生成方法,应充分利用完全二叉搜索树的性质。坑点如下1,通过对输入的序列从小到大排列得到中序序列(二叉搜索树的性质)2,设立一个CBT数组,应用完全二叉搜素树的性质将中序序列的数一一存入数组中。注意递归边界为,结点编号大于结点个数。void tree(int root){ if(root>n)return ; tree(root*2); CBT[root]=in[num++]; tree(root*2+1);}3,存储的CBT数组本身原创 2021-08-08 10:29:56 · 71 阅读 · 0 评论 -
1079 Total Sales of Supply Chain (25 分)
本题我采用的是树的静态表示方法坑点如下;1,注意本题求经销商按成本价卖出的销售额2,本题采用队列方式,另有DFS写法;整体代码如下#include<cstdio>#include<cmath>#include<algorithm>#include<vector>#include<queue>using namespace std;const int maxn=100100;int n;double p,r;struct原创 2021-08-06 17:10:06 · 71 阅读 · 0 评论 -
1066 Root of AVL Tree (25 分)
本题考察平衡二叉树的生成。坑点如下1,树的结构体定义,增加了高度变量,2,写一个创建新结点函数创建新结点,令其高度为1,赋值数据,令其左右子树为空,返回值为结点指针。node* newnode(int v){ node* root=new node; root->height=1; root->data=v; root->lchild=root->rchild=NULL; return root;}3,更新高度的方法int g原创 2021-08-09 13:38:36 · 73 阅读 · 0 评论 -
1086 Tree Traversals Again (25 分)
用栈来模拟一颗二叉树的先序和中序过程,求这颗二叉树的后序遍历序列坑点如下1,由题意栈的输入顺序和先序遍历的顺序一致,栈的输出为中序遍历一致。2,创建二叉树的写法其中当先序长度小于等于0时返回值为空(由于函数为node型函数)创建一个新的node地址变量 rootNode s = new Node是在堆中申请一块内存并存放一个Node类的新对象。之后给变量指向的结点赋值。用递归的方式分别创建其左右子树node* create(int preL,int preR,int inL,int inR原创 2021-08-06 13:58:44 · 56 阅读 · 0 评论 -
1090 Highest Price in Supply Chain (25 分)
经销商问题,本题为A1079的简化,这题我用的是队列来处理;坑点如下1,树的静态写法struct Node{ double price; vector<int>child; }node[maxn];整体代码如下#include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<vector>using namesp原创 2021-08-06 18:51:25 · 55 阅读 · 0 评论 -
1094 The Largest Generation (25 分)
家族树问题,本题我用的是队列的方法坑点如下1,设置了一个levelnum数组记录每一代人数2,定义全局变量maxlevel记录有最大人数的代数3,整体代码如下#include<cstdio>#include<algorithm>#include<cmath>#include<queue>#include<vector>using namespace std;int maxp=-1;int n,m;const int ma原创 2021-08-06 19:48:17 · 74 阅读 · 0 评论 -
1099 Build A Binary Search Tree (30 分)
任意二叉搜索树的构建方法,本题采用二叉树静态写法较为方便坑点如下1,将输入序列从小到大依次排列为对应二叉搜索树的中序遍历2,采用DFS方法将中序遍历序列依次存入二叉搜索树中,注意递归边界。void DFS(int root,int data){ if(root==-1)return ; DFS(node[root].lchild,in[num]); node[root].data=in[num++]; DFS(node[root].rchild,in[num]原创 2021-08-08 11:03:45 · 52 阅读 · 0 评论 -
1102 Invert a Binary Tree (25 分)
反转二叉树本题采用静态二叉树较为方便,注意静态二叉树的写法;1,静态二叉树的写法struct Node{ int data; char lchild; char rchild;}node[15];2,层序遍历的写法其中队列里是结构体。void layerorder(int root){ queue<Node>Q; Q.push(node[root]); while(!Q.empty()){ Node q=Q.front()原创 2021-08-06 16:05:09 · 67 阅读 · 0 评论 -
1106 Lowest Price in Supply Chain (25 分)
经销商问题,与前几题类似;坑点如下1,很大的数的表示方法const double INF=1e12;整体代码如下#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>using namespace std;const int maxn=100010;const doub原创 2021-08-06 19:51:05 · 88 阅读 · 0 评论 -
1110 Complete Binary Tree (25 分)
判断一棵树是否是完全二叉树,本题开始写的很复杂,后来参考了柳神的代码,柳婼代码原地址~~坑点如下1,stoi函数的使用,将string变量转换成整型变量#include<iostream>for(int i=0;i<n;i++){ string l,r; cin>>l>>r; if(l=="-"){node[i].l=-1;} else{node[i].l=stoi(l);原创 2021-08-17 21:10:15 · 65 阅读 · 0 评论 -
1115 Counting Nodes in a BST (30 分)
二叉搜索树的遍历,用DFS方法即可代码如下#include<cstdio>#include<vector>using namespace std;struct Node{ int data; Node* lchild; Node* rchild;};void insert(Node* &root,int data){ if(root==NULL){ root=new Node; root->data=原创 2021-08-19 13:31:32 · 74 阅读 · 0 评论 -
1119 Pre- and Post-order Traversals (30 分)
已知先序遍历和后序遍历,求中序遍历本题我参考了柳婼的做法柳神代码链接分析如下整体代码如下#include<cstdio>#include<vector>using namespace std;bool flag=true;int n;int post[35],pre[35];int num=0;vector<int>in;void getIN(int prel,int prer,int postl,int postr){ if(prel原创 2021-08-20 14:57:24 · 94 阅读 · 0 评论 -
1123 Is It a Complete AVL Tree (30 分)
平衡二叉树问题,本题考察的知识点有,平衡二叉树的生成,左旋,右旋,如何判断一个树是否是完全二叉树,二叉树的层序遍历。坑点如下1,将左旋函数和右旋函数写反了导致段错误。整体代码如下#include<cstdio>#include<algorithm>#include<queue>using namespace std;struct Node{ int data,height; Node* lchild; Node* rchild;}原创 2021-08-20 21:40:28 · 94 阅读 · 0 评论 -
1127 ZigZagging on a Tree (30 分)
树的生成问题。已知树的后序和中序遍历,求左右交替的层序遍历。本题考察的要点有已知树的后序和中序遍历,生成一颗树。再生成的树的各个结点中赋值深度。将各个深度的结点存储到数组中,按需输出坑点如下1,改变放入队列的左右孩子顺序无法解决这道问题,因为上一层中的最左端结点首先被压入了队列中。2,在存储的数组中,深度为偶数时,逆序输出,为奇数时,顺序输出(从0开始)。整体代码如下#include<cstdio>#include<algorithm>#include<原创 2021-08-21 17:28:53 · 73 阅读 · 0 评论 -
1130 Infix Expression (25 分)
给一个二叉树,输出中缀表达式,且加上括号表示运算的优先级~~。参考柳神的做法柳婼代码链接坑点如下1,给二叉树各节点赋值高度的方法2,中缀表达式递归的写法如果当前为叶子结点,直接返回自己的字符串,如果为非叶子结点(右子树不为空),那么返回递归左+当前字符串+递归右结点,并加上括号。如果左右结点有空的,返回字符串""#include<cstdio>#include<algorithm>#include<cstring>#include<iostrea原创 2021-08-22 22:20:16 · 89 阅读 · 0 评论 -
1135 Is It A Red-Black Tree (30 分)
判断所给的????是否是红黑树,本题考察了红黑树的定义坑点如下红黑树的判据1,根结点一定是黑2,当前结点为红,其两个孩子结点一定是黑3,任意一个结点到其所有根结点的路径含有相同的黑结点个数(判断方式)4,注意判断代码的写法从根结点依次判断左右结点。bool judge1(node* root){ if(root==NULL)return true; if(root->data<0) { if(root->lchild!=NULL&&ro原创 2021-08-30 11:56:10 · 67 阅读 · 0 评论 -
1143 Lowest Common Ancestor (30 分)
二叉搜索树找第一个祖先结点。坑点如下1,先序遍历,找到的第一个符合要求的结点一定是二者的最小祖先结点证明如下如果两数分布在根结点两端,直接找到,如果两数在左子树,则按根左右可找到,如果都在右子树,则根左找完后均找不到,之后再找右子树,一定能找到。整体代码如下#include<bits/stdc++.h>using namespace std;map<int,int>d;int main(){ int m,n,k1,k2,l,a; scanf("%d%原创 2021-08-29 21:52:56 · 89 阅读 · 0 评论 -
1151 LCA in a Binary Tree (30 分)
已知二叉树的先序和中序遍历,求其最低的公共祖先结点。本题和1143十分相似,不用建树,直接用map把树映射成二叉搜索树,之后按照1143同样的方法就容易解决了。坑点如下1,二叉搜索树的中序遍历一定是一个从小到大的数组,可以利用这一性质来进行映射。#include<cstdio>#include<map>#include<vector>using namespace std;map<int,int>re,y;int main(){ in原创 2021-09-01 14:31:54 · 98 阅读 · 0 评论