相同的测试用例,但代码块和 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++ 中使用 malloctypedef 和结构? 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 *,但它并不总是这样做:如果nodeNULL,它会返回return createnode(value);,但在所有其他情况下它不会返回值。你的编译器应该对此大声抱怨。

因此:

node->right=insertnode(value,node->right);

如果最初是NULL,则此行将新节点分配给node-&gt;right。但如果不是NULLnode-&gt;right 会被垃圾值覆盖。


其他问题:

这里有内存泄漏:

tnode *root=(tnode*)malloc(sizeof(tnode));
root=NULL;

malloc 返回的指针丢失,因为第二行用NULL 覆盖它。

在 C++ 中手动 typedefing 结构类型毫无意义。当您执行struct node ... ; 时,您会自动定义两个名称:struct nodenode。不需要typedef

不推荐在 C++ 中使用 mallocnew(或new [])会更好;更好的是某种智能指针;最好是一些为您处理内存管理的容器类型。

【讨论】:

以上是关于相同的测试用例,但代码块和 Ideone 的输出不同的主要内容,如果未能解决你的问题,请参考以下文章

代码在 ideone 中编译,但不使用 gcc

A + B,末k位不相同

ideone超过了时间限制,但代码块没有

测试用例设计方法

1015.还是A+B

黑盒测试用例设计总结