好的,我最近开始尝试与树相关的问题,有一个简单的代码可以找到二叉搜索树的高度。它在我的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);
}
}
提前谢谢你,如果我在提问时犯了错误,我很抱歉。
答案 0 :(得分:2)
主要问题是insertnode
。它被声明为返回tnode *
,但它并不总是如此:如果return createnode(value);
为node
,它会NULL
,但在所有其他它没有返回值的情况。你的编译器应该大声抱怨。
因此:
node->right=insertnode(value,node->right);
如果最初的node->right
NULL
,此行会为NULL
分配一个新节点。但如果它不是node->right
,tnode *root=(tnode*)malloc(sizeof(tnode));
root=NULL;
会被垃圾值覆盖。
其他问题:
这里有内存泄漏:
malloc
NULL
返回的指针会丢失,因为第二行会用typedef
覆盖它。
在C ++中手动struct node { ... };
结构类型没有意义。执行struct node
后,系统会自动定义两个名称:node
和typedef
。不需要malloc
。
建议不要在C ++中使用new
。 new []
(或 <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>
)会更好;更好的是某种智能指针;最好的是一些处理内存管理的容器类型。