最近バイナリツリーを実装しようとしていますが、1000未満の値で動作するようですが、その後はスタックオーバーフローエラーが発生しますバイナリツリーのサンプル実装が多数の値に対して機能しない
例えば#include<iostream>
#include<math.h>
using namespace std;
struct Node{
long long int val;
Node *left;
Node *right;
};
struct BinaryTree{
Node *head = (Node*) malloc(sizeof(Node));
bool headSet = false;
Node* findLast(Node *asgn,int val){
if (val > asgn->val){
if (asgn->right != NULL)
asgn = findLast(asgn->right, val);
else
return asgn;
}
else{
if (asgn->left != NULL)
asgn = findLast(asgn->left, val);
else
return asgn;
}
return asgn;
}
void insert(long long int vals){
if (headSet){
Node *asgn = (Node*) malloc(sizeof(Node));
asgn = findLast(head,vals);
Node *fix = (Node*)malloc(sizeof(Node));
fix->val = vals;
fix->left = NULL;
fix->right = NULL;
if (vals > asgn->val){
asgn->right = fix;
asgn->left = NULL;
}
else{
asgn->right = NULL;
asgn->left = fix;
}
}
else{
head->val = vals;
head->right = NULL;
head->left = NULL;
headSet = true;
}
}
};
int main(){
BinaryTree a;
for (long long int i = 0; i < 100;i++)
a.insert(i);
return 0;
}
: - 私は
for (long long int i = 0; i < 100;i++)
a.insert(i);
for (long long int i = 0; i < 10000;i++)
a.insert(i);
に変更した場合それは私にエラーを与える。私はスタックがオーバーフローするところで、なぜこれが起こっているのか分かりません。
@Treycos私はそれを最小限にするために何をすることができます。私の提案は
headSet
メンバーを省略してNULL
にhead
メンバーを初期化し、最初の挿入時にhead
を割り当て、このようにしているのですか? –@Treycos porgとは何ですか? –
asgnのメモリを割り当ててから、ポインタをfindLast()の戻り値で上書きします。これはメモリリークの原因になります(スタックオーバーフローの原因ではありません)。 – samgak