我知道幾乎沒有類似標題的問題,但是我檢查了它們,但仍然無法解決我的錯誤。
這是 BST 實作:
struct node {
int val;
node* left;
node* right;
};
node* createNewNode(int x)
{
node* nn = new node;
nn->val = x;
nn->left = nullptr;
nn->right = nullptr;
return nn;
}
void bstInsert(node* &root, int x)
{
if(root == nullptr) {
root = createNewNode(x);
return;
}
if(x < root->val)
{
if(root->left == nullptr) {
root->left = createNewNode(x);
return;
} else {
bstInsert(root->left, x);
}
}
if( x > root->val )
{
if(root->right == nullptr) {
root->right = createNewNode(x);
return;
} else {
bstInsert(root->right, x);
}
}
}
這是我的主要內容:
int main() {
node *root = nullptr;
for (int i = 0; i < 100000; i ) {
bstInsert(root, i);
}
}
如果我嘗試插入 10000 個元素,那么它可以正常作業。但是,當我嘗試插入 100000 個元素時,我會進入除錯器:
Signal = SIGSEGV (Segmentation fault)
當回圈中的 I 值達到 32469 時會發生這種情況,我錯過了什么?
uj5u.com熱心網友回復:
首先,您的二叉搜索樹是右偏二叉樹,因為新元素將被添加為現有樹的最右邊的子元素。
也就是說,對于每次插入,遞回將與i傳遞給的值一樣深,bstInsert()并且對于某些大的值i,最終它會在遞回時耗盡空間并崩潰。在這么大的樹中使用遞回插入并不是一個好主意。最好進行迭代實作。
附加:
添加對new操作員故障的檢查。
PS:
在我的系統上,您的代碼不會因100000元素插入而崩潰:)。
uj5u.com熱心網友回復:
有趣的是,您的代碼在 fedora g 編譯器上對我來說作業得很好。可能是我的編譯器將 8Bytes 分配給整數,而您的編譯器可能將 4Bytes 分配給整數,所以請試試這個并告訴我。
#include <iostream>
struct node {
long val;
node* left;
node* right;
};
node* createNewNode(long x)
{
node* nn = new node;
nn->val = x;
nn->left = nullptr;
nn->right = nullptr;
return nn;
}
void bstInsert(node* &root, long x)
{
if(root == nullptr) {
root = createNewNode( x);
return;
}
if(x < root->val)
{
if(root->left == nullptr) {
root->left = createNewNode(x);
return;
} else {
bstInsert(root->left, x);
}
}
if( x > root->val )
{
if(root->right == nullptr) {
root->right = createNewNode(x);
return;
} else {
bstInsert(root->right, x);
}
}
}
int main() {
node *root = nullptr;
for (long i = 0; i < 100000; i ) {
bstInsert(root, i);
std::cout << i << std::endl; // printing output to see the results using short gives overlow.
}
}
如果這不起作用,那么您的計算機記憶體沒有所需的那么多可用,那么您可能只有不到 785 KB 的 CPU CACHE,因為在運行時程式在快取中,并且 100000 可能使用? 785 KB 記憶體,在這種特定情況下位于快取中,因為它處于運行時且尚未對其應用任何管理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/421512.html
標籤:
上一篇:誰能解釋這段代碼?我不明白not1()和ptr_fun()的作業原理
下一篇:試圖理解移動語意
