打印不平衡二叉树
Printing unbalanced binary tree
我在这段代码中故意创建了一个错误且不平衡的二叉树:
void createlist (tree*& node) {
node = new tree;
node->num = 1;
node->left = new tree;
node->left ->num = 2;
node->right = new tree;
node->right->num = 3;
node->left->left = new tree;
node->left->left->num = 4;
node->left->right = new tree;
node->left->right->num = 5;
node->right->left = new tree;
node->right->left->num = 6;
node->left->left->left = new tree;
node->left->left->left->num = 7;
}
然后,当我尝试使用普通函数打印它时:
void print (tree* node) {
if (node!= 0) {
print (node->left);
cout << node->num << " ";
print (node->right);
}
}
它抛出一个错误:
Access violation reading location 0xcdcdcdd5.
在这个位置:
print (node->left);
我只是从树开始,并没有完全理解这个错误的原因。你能帮忙吗?
如果没有你的 tree
class 的来源很难判断,但也许制作 new tree
不会初始化 left
和 right
成员到空指针?在这种情况下,您的一些树将包含未初始化的指针数据。
这是您学习如何调试程序的绝好机会。我建议你 运行 调试器中的程序,看看发生段错误时 node 和 node->left 的值是什么。
access violation 是当您正在访问您的程序不允许访问的内存时。
你的问题不是树,你的问题是正确使用 pointers 而不是正确初始化变量。
我怀疑你的问题是树的 constructor 没有正确地做:
left = NULL;
right = NULL;
请记住,在 C/C++ 中,编译器在创建变量时不会将任何特定值设置到变量中,由您来初始化变量。
习惯使用 NULL(或 C++11 中的 nullptr)而不是 0 到 test/set 指针。
我在这段代码中故意创建了一个错误且不平衡的二叉树:
void createlist (tree*& node) {
node = new tree;
node->num = 1;
node->left = new tree;
node->left ->num = 2;
node->right = new tree;
node->right->num = 3;
node->left->left = new tree;
node->left->left->num = 4;
node->left->right = new tree;
node->left->right->num = 5;
node->right->left = new tree;
node->right->left->num = 6;
node->left->left->left = new tree;
node->left->left->left->num = 7;
}
然后,当我尝试使用普通函数打印它时:
void print (tree* node) {
if (node!= 0) {
print (node->left);
cout << node->num << " ";
print (node->right);
}
}
它抛出一个错误:
Access violation reading location 0xcdcdcdd5.
在这个位置:
print (node->left);
我只是从树开始,并没有完全理解这个错误的原因。你能帮忙吗?
如果没有你的 tree
class 的来源很难判断,但也许制作 new tree
不会初始化 left
和 right
成员到空指针?在这种情况下,您的一些树将包含未初始化的指针数据。
这是您学习如何调试程序的绝好机会。我建议你 运行 调试器中的程序,看看发生段错误时 node 和 node->left 的值是什么。
access violation 是当您正在访问您的程序不允许访问的内存时。
你的问题不是树,你的问题是正确使用 pointers 而不是正确初始化变量。
我怀疑你的问题是树的 constructor 没有正确地做:
left = NULL;
right = NULL;
请记住,在 C/C++ 中,编译器在创建变量时不会将任何特定值设置到变量中,由您来初始化变量。
习惯使用 NULL(或 C++11 中的 nullptr)而不是 0 到 test/set 指针。