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 · 53 阅读 · 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 · 64 阅读 · 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 · 45 阅读 · 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 · 43 阅读 · 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 · 38 阅读 · 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 · 38 阅读 · 0 评论 -
1086 Tree Traversals Again (25 分)
用栈来模拟一颗二叉树的先序和中序过程,求这颗二叉树的后序遍历序列 坑点如下 1,由题意栈的输入顺序和先序遍历的顺序一致,栈的输出为中序遍历一致。 2,创建二叉树的写法 其中当先序长度小于等于0时返回值为空(由于函数为node型函数) 创建一个新的node地址变量 root Node s = new Node是在堆中申请一块内存并存放一个Node类的新对象。 之后给变量指向的结点赋值。 用递归的方式分别创建其左右子树 node* create(int preL,int preR,int inL,int inR原创 2021-08-06 13:58:44 · 34 阅读 · 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 · 32 阅读 · 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 · 41 阅读 · 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 · 28 阅读 · 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 · 48 阅读 · 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 · 58 阅读 · 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 · 31 阅读 · 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 · 41 阅读 · 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 · 60 阅读 · 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 · 70 阅读 · 0 评论 -
1127 ZigZagging on a Tree (30 分)
树的生成问题。已知树的后序和中序遍历,求左右交替的层序遍历。 本题考察的要点有 已知树的后序和中序遍历,生成一颗树。 再生成的树的各个结点中赋值深度。 将各个深度的结点存储到数组中,按需输出 坑点如下 1,改变放入队列的左右孩子顺序无法解决这道问题,因为上一层中的最左端结点首先被压入了队列中。 2,在存储的数组中,深度为偶数时,逆序输出,为奇数时,顺序输出(从0开始)。 整体代码如下 #include<cstdio> #include<algorithm> #include<原创 2021-08-21 17:28:53 · 49 阅读 · 0 评论 -
1130 Infix Expression (25 分)
给一个二叉树,输出中缀表达式,且加上括号表示运算的优先级~~。 参考柳神的做法 柳婼代码链接 坑点如下 1,给二叉树各节点赋值高度的方法 2,中缀表达式递归的写法 如果当前为叶子结点,直接返回自己的字符串,如果为非叶子结点(右子树不为空),那么返回递归左+当前字符串+递归右结点,并加上括号。如果左右结点有空的,返回字符串"" #include<cstdio> #include<algorithm> #include<cstring> #include<iostrea原创 2021-08-22 22:20:16 · 65 阅读 · 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 · 37 阅读 · 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 · 58 阅读 · 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 · 64 阅读 · 0 评论