【发布时间】:2015-12-06 22:58:39
【问题描述】:
我已经尝试解决这个问题将近 3 天了,但还没有运气。我正在尝试将许多大小为(500 万)个无符号整数的元素插入二叉树。
当我将要插入的总元素限制为 10K 时,此代码工作正常,但是,当我将总元素设置为 500 万时,它不起作用。 我在我的电脑上运行这段代码:
- Windows 7 - 32
- 内存 4 GB
任何帮助将不胜感激。提前致谢 :) 这是我的代码:
#include<stdlib.h>
#include<stdio.h>
typedef int ElementType;
typedef struct TreeNode {
ElementType element;
struct TreeNode *left, *right;
} TreeNode;
TreeNode *createTree(){
//Create the root of tree
TreeNode *tempNode;
tempNode = malloc(sizeof(TreeNode));
tempNode->element = 0;
tempNode->left = NULL;
tempNode->right = NULL;
return tempNode;
}
TreeNode *createNode(ElementType X){
//Create a new leaf node and return the pointer
TreeNode *tempNode;
tempNode = malloc(sizeof(TreeNode));
tempNode->element = X;
tempNode->left = NULL;
tempNode->right = NULL;
return tempNode;
}
TreeNode *insertElement(TreeNode *node, ElementType X){
//insert element to Tree
if(node==NULL){
return createNode(X);
}
else{
if(X < node->element){
node->left = insertElement(node->left, X);
return node; // add this.
}
else if(X > node->element){
node->right = insertElement(node->right, X);
return node; // add t
else if(X == node->element){
printf("Oops! the element is already present in the tree.");
}
}
}
TreeNode *displayTree(TreeNode *node){
//display the full tree
if(node==NULL){
return;
}
displayTree(node->left);
printf("| %d ", node->element);
displayTree(node->right);
}
main(){
//pointer to root of tree #2
TreeNode *TreePtr;
TreeNode *TreeRoot;
TreeNode *TreeChild;
//Create the root of tree
TreePtr = createTree();
TreeRoot = TreePtr;
TreeRoot->element = 32;
for ( int i=0; i < 5000000; i ++)
insertElement(TreeRoot, i);
displayTree(TreeRoot);
}
任何帮助将不胜感激。在此先感谢:)
【问题讨论】:
-
很难说不知道您遇到了什么错误。由于您使用递归,根据添加项目的顺序,递归可能会导致堆栈溢出。由于二叉树不必平衡,插入数据大部分已经排序的项目将导致非常深且不平衡的树,并且深度递归调用将导致堆栈溢出。如果可以,请尝试使用 B-tree(平衡树)
-
为什么总是插入值八 (8)?如我所见,你总是会得到一棵只有一个键(八个)的树
-
其实是笔误,应该是“i”
-
“它不起作用”。这本身就不是一个有效的问题描述。请描述实际的错误或不正确的行为是什么。
-
^^ 你以为我们不需要知道吗? :((
标签: c tree binary-search-tree