相同的测试用例,但代码块和 Ideone 的输出不同
Posted
技术标签:
【中文标题】相同的测试用例,但代码块和 Ideone 的输出不同【英文标题】:Same test case but different output on codeblocks and Ideone 【发布时间】:2017-10-19 18:56:43 【问题描述】:好的,我最近开始尝试与树相关的问题,有一个简单的代码可以找到二叉搜索树的高度。它在我的 CodeBlocks 系统上运行良好,但是当我在在线 IDE 上编译它时会给出不同的输出(每次 2 次)。例如在代码块上
4
2 1 3 4
输出 3
但在在线 IDE(Ideone、Codechef、Hackerearth)上
4
2 1 3 4
输出 2
不仅是这个测试用例,所有的测试用例都在线给出输出2。请帮忙!!
代码:
#include<iostream>
#include<cstdlib>
using namespace std;
typedef struct node
struct node* left;
long value;
struct node* right;
tnode;
tnode* insertnode(long,tnode*);
tnode* createnode(long);
int height(tnode*);
void preorder(tnode*);
int main()
int n,i;
cin>>n;
long input[n];
for(i=0;i<n;i++)
cin>>input[i];
tnode *root=(tnode*)malloc(sizeof(tnode));
root=NULL;
//cout<<"HI"<<endl;
root=insertnode(input[0],root);
for(i=1;i<n;i++)
insertnode(input[i],root);
//preorder(root);
cout<<height(root)<<endl;
return 0;
tnode* insertnode(long value,tnode* node)
if(node==NULL)
return createnode(value);
else if(value<node->value)
node->left=insertnode(value,node->left);
else if(value>node->value)
node->right=insertnode(value,node->right);
tnode* createnode(long value)
tnode* temp=(tnode*)malloc(sizeof(tnode));
temp->value=value;
temp->left=temp->right=NULL;
return temp;
int height(tnode* node)
int lht,rht;
if(node==NULL)
return 0;
else
lht=height(node->left);
rht=height(node->right);
if(lht>=rht)
return lht+1;
else
return rht+1;
void preorder(tnode* temp)
if(temp!=NULL)
cout<<temp->value<<" ";
preorder(temp->left);
preorder(temp->right);
提前谢谢你,如果我在提问时犯了任何错误,我们深表歉意。
【问题讨论】:
为什么在 C++ 中使用malloc
和 typedef
和结构?
root = malloc(...); root = NULL;
是内存泄漏。
insertnode
不会在所有路径上返回值。错误就在那里。
你真的不应该做所有手动内存管理 - 使用智能指针、容器等。为了 $DEITY 的爱,至少使用new
/delete
在 C++ 中,NOT malloc
/free
(但实际上只使用容器和/或智能指针)。哦,不要使用NULL
,使用nullptr
。此外,using namespace std;
是一个非常糟糕的主意。至于long input[n];
;标准 C++ 不支持可变长度数组,您依赖于编译器扩展 - 使用 std::vector
。这只是粗略的一瞥——这段代码有很多严重的问题。
【参考方案1】:
主要问题是insertnode
。它被声明返回tnode *
,但它并不总是这样做:如果node
是NULL
,它会返回return createnode(value);
,但在所有其他情况下它不会返回值。你的编译器应该对此大声抱怨。
因此:
node->right=insertnode(value,node->right);
如果最初是NULL
,则此行将新节点分配给node->right
。但如果不是NULL
,node->right
会被垃圾值覆盖。
其他问题:
这里有内存泄漏:
tnode *root=(tnode*)malloc(sizeof(tnode));
root=NULL;
malloc
返回的指针丢失,因为第二行用NULL
覆盖它。
在 C++ 中手动 typedef
ing 结构类型毫无意义。当您执行struct node ... ;
时,您会自动定义两个名称:struct node
和node
。不需要typedef
。
不推荐在 C++ 中使用 malloc
。 new
(或new []
)会更好;更好的是某种智能指针;最好是一些为您处理内存管理的容器类型。
【讨论】:
以上是关于相同的测试用例,但代码块和 Ideone 的输出不同的主要内容,如果未能解决你的问题,请参考以下文章