接下来的三个代码之间有什么区别.
1:
struct node
{
int data;
}tree[100050];
/*
some codes
*/
int main()
{
int tot;
scanf("%d",&tot);
int tmp;
for(int i=0;i<=tot;++i){
scanf("%d",&tmp);
tree[i].data=tmp;
insert(i,1);
}
}
Run Code Online (Sandbox Code Playgroud)
错误的答案
2:
struct node
{
int data;
}tree[100050];
/*
some codes
*/
int main(){
int n;
scanf("%d",&n);
int tmp;
for(int i=0;i<=n;++i){
scanf("%d",&tree[i].data);
insert(i,1);
}
}
Run Code Online (Sandbox Code Playgroud)
公认
3:
struct node
{
int data;
}tree[100050];
/*
some codes
*/
int main()
{
int tot;
scanf("%d",&tot);
int tmp;
for(int i=0;i<=tot;++i){
scanf("%d",&tmp);
tree[i].data=tmp;
insert(i,1);
tmp=0;
}
}
Run Code Online (Sandbox Code Playgroud)
公认
第一个代码无法通过所有测试,但接下来的两个代码可以通过所有测试.
问题出在这里POJS024.它是用中文写的.输入是构建二进制排序树的数字列表,第一个数字是根.输出有序遍历和后序遍历.
这三个都使用错误的逻辑.你在第二个和第三个中幸运,可能是因为insert有一些特殊的值等于0的处理.
这三个中的错误就是你正在使用
for(int i=0;i<=n;++i){
Run Code Online (Sandbox Code Playgroud)
代替
for(int i=0;i<n;++i){
^^^ Needs to be < not <=
Run Code Online (Sandbox Code Playgroud)
如果您有代码来检查返回值scanf,那么您很快就会发现错误.
if ( scanf(...) == 1 )
{
insert(i,1);
}
Run Code Online (Sandbox Code Playgroud)
这就是为什么你养成检查scanf函数族的返回值的习惯,这一点非常重要,以确保你能够读取你期望的所有数据.