相同的测试用例但在codeblocks和Ideone上有不同的输出

时间:2017-10-19 18:56:44

标签: c++ tree

好的,我最近开始尝试与树相关的问题,有一个简单的代码可以找到二叉搜索树的高度。它在我的CodeBlocks系统上工作正常,但是当我在在线IDE上编译时,它会提供不同的输出(每次2次)。例如On codeblocks

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);
    }
}

提前谢谢你,如果我在提问时犯了错误,我很抱歉。

1 个答案:

答案 0 :(得分:2)

主要问题是insertnode。它被声明为返回tnode *,但它并不总是如此:如果return createnode(value);node,它会NULL,但在所有其他它没有返回值的情况。你的编译器应该大声抱怨。

因此:

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

如果最初的node->right NULL,此行会为NULL分配一个新节点。但如果它不是node->righttnode *root=(tnode*)malloc(sizeof(tnode)); root=NULL; 会被垃圾值覆盖。

其他问题:

  • 这里有内存泄漏:

    malloc

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

  • 在C ++中手动struct node { ... };结构类型没有意义。执行struct node后,系统会自动定义两个名称:nodetypedef。不需要malloc

  • 建议不要在C ++中使用newnew [](或 <label className="searchSecondary_userFilterFacet" hidden={!this.state.isExpanded} > <div className="data-uk-autocomplete" id="userFilterTypeahead" ref={elem => (this.userFilterTypeahead = elem)} > <input id="textInput_userSearch" onKeyUp={this._handleNewUser} placeholder="Search Users" type="text" ref={input => (this.userInput = input)} /> </div> {userModifiers} </label> )会更好;更好的是某种智能指针;最好的是一些处理内存管理的容器类型。