二叉树插入:
#include "stdafx.h"
#include <iostream>
using namespace std;
struct TreeNode {
int value;
TreeNode* left;
TreeNode* right;
};
struct TreeType {
TreeNode* root;
void insert(TreeNode* tree, int item);
void insertItem(int value) {
insert(root, value);
}
};
void TreeType::insert(TreeNode* tree, int number) {
if (tree == NULL) {
tree = new TreeNode;
tree->left = NULL;
tree->right = NULL;
tree->value = number;
cout << "DONE";
} else if (number < tree->value) {
insert(tree->left, number);
} else {
insert(tree->right, number);
}
}
int main() {
TreeType* MyTree = new TreeType;
MyTree->insertItem(8);
return 0;
}
我目前正在学习C ++中的数据结构,这是在二进制树中进行插入的代码。
编译后,一切看起来都很好,但是当我尝试执行该程序时,它崩溃了。
谁能告诉我我哪里错了?
在树构造函数中,您需要将根指针初始化为NULL。不保证将其初始化为NULL。
在Linux中进行编译时,可以使用gdb来显示segfault的来源。
其他注意事项:
root
分配新节点后,应将值分配回给。您之所以没有这样做,是因为您缺少了c ++的基本原理之一。也就是说,它基于c。关于c的事情严格来说是一个“按值”函数/方法调用范例。因此,函数调用中的所有参数都是按值。当您传递根的内存地址时,实际上是在复制指针的值。然后,您只更新本地值。您需要将其分配回根目录。如果您想从头到尾学习该概念,我强烈建议您观看斯坦福大学的杰里·凯恩(Jerry Cain)的《编程范例》课程。this->root
和this->insert
表示法。如果您不小心创建了局部范围的root
变量,它不仅可以正确解析,而且对于定义数据或方法的读者来说也很清楚。出色的编码与沟通有关。读者仅需花费100-500毫秒即可了解符号所指向的位置。但是,为避免歧义,您可以积累的微薄积蓄会累积到更清晰的软件中。您未来的自我(和您的同事)将感谢您。参见http://msmvps.com/blogs/jon_skeet/archive/2013/09/21/career-and-skills-advice.aspx最后,我不能高估从源头学习的重要性。如果您是初次学习c或c ++,请阅读http://www.amazon.com/The-Programming-Language-4th-Edition/dp/0321563840和http://www.amazon.com/Programming-语言2nd-Brian-Kernighan / dp / 0131103628。它将节省您数小时,数小时的麻烦。从源头学习之后,编程也将变得更加有趣,因为您了解了其中的大部分概念。而且,事实是,当您具有一定水平的能力时,事情会变得更加有趣。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句