项目场景:
Time Limit: | 1000 ms |
Memory Limit: | 128 MB |
Case score: | 10 |
Level: | 4 |
Type: | Traditional Problem |
Validator: | Generic Comparsion |
问题描述
1705 -- 构建二叉树
Description
树的表示方法很多,可以采用自然界的树形表示法如图,另外也可以采用括号表示法,先将根结点放入一对圆括号中,然后把它的子树按由左往右的顺序放入括号中,而对子树也采用同样的方法处理。同层子树与它的根结点用圆括号扩起来,同层子树之间用逗号格开,最后用闭括号括起来。如图所示的树可以表示成:(11(22(44,55),33))
由完全二叉树的定义我们可知,如果知道该完全二叉树的结点个数,则可以构建出一棵确定的完全二叉树,现在输入完全二叉树的结点数 NN,用括号表示法输出这棵树。(默认树的结点名称为树结点的编号)
Input
一个整数 NN,表示 完全二叉树的结点个数。
Output
NN 个结点的完全二叉树的括号表示。
Sample Input
#1
4
#2
5
Sample Output
#1
(1(2(4),3))
#2
(1(2(4,5),3))
Hint
100%的数据:N <= 2^14
请用递归完成此题
这题看着数据挺吓人的
以为用是啥高深算法
其实只不过是个dfs
用递归做,不超时
括号多了也是错,格式问题嘛
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n;
inline void dfs(int x,int trip){
cout<<x;
int flag=0;
if(2*x+1<=n) flag++;
if(2*x<=n) flag++;
if(flag){
cout<<"(";
if(flag==2){
dfs(2*x,1);
cout<<",";
dfs(2*x+1,0);
}
else{
if(2*x<=n) dfs(2*x,0);
else dfs(2*x+1,0);
}
}
if(!trip) cout<<")";
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
if(n==1){
cout<<"(1)";
return 0;
}
cout<<"(";
dfs(1,1);
cout<<")";
return 0;
}
原因分析:
- 时间不够
- 对完全二叉树相邻两层父子节点的编号,父亲节点编号为n,左孩子节点编号为2*n,右孩子节点编号为2*n+1,不熟悉
- 对于括号的输出,存在一定的格式错误,需设变量trip表示需不需要加)
- 审题不仔细,格式为(1())
解决方案:
调试,输出中间变量,找博客
另外,本文有何不妥,尽管喷,我只不过是一蒟蒻而已