二叉树插入:
#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来显示段错误的来源。
其他一些注意事项:
- 您应该将值分配回
root
分配新节点后。你没有这样做是因为你缺少 C++ 的基础知识之一。也就是说,它是基于c的。关于 c 的问题是,它是严格的“按值”函数/方法调用范例。所以函数调用中的所有参数都是按值传递的。当您传入 root 的内存地址时,实际上是在复制指针的值。然后,您只需更新本地值。您需要将其分配回 root。如果您想从头到尾学习这个概念,我强烈建议您观看.
- 在你的主函数中,你应该尝试将符号名称保留为小写而不是驼峰命名。这有助于区分变量和类型(类型应保持驼峰命名法)。
- 在 TreeType::insert 方法中,您应该调用变量 tree_node 而不是 tree。这样做有助于反映正确的类型并避免混淆。
- 只要有可能,请尝试使用
this->root
and this->insert
符号。如果您不小心创建了本地范围的文件,它不仅会正确解析root
变量,但读者也更清楚数据或方法的定义位置。优秀的编码与沟通有关。读者可能只需要 100-500 毫秒就能理解该符号指向的位置;然而,在避免歧义方面所积累的微小节省加起来就会成为一个更加清晰的软件。未来的你(和你的同事)会感谢你。看http://msmvps.com/blogs/jon_skeet/archive/2013/09/21/career-and-skills-advice.aspx 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 https://rads.stackoverflow.com/amzn/click/com/0321563840 and http://www.amazon.com/Programming-Language-2nd-Brian-Kernighan/dp/0131103628 https://rads.stackoverflow.com/amzn/click/com/0131103628。它将为您节省数小时、数小时、数小时。从源代码中学习之后,编程也会变得更加有趣,因为您了解了大部分概念。而且,事实是,当你拥有一定水平的能力时,事情会变得更有趣。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)