二叉树实现C ++

德利古库

二叉树插入:

#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 ++中的数据结构,这是在二进制树中进行插入的代码。

编译后,一切看起来都很好,但是当我尝试执行该程序时,它崩溃了。

谁能告诉我我哪里错了?

荷马6号

在树构造函数中,您需要将根指针初始化为NULL。不保证将其初始化为NULL。

在Linux中进行编译时,可以使用gdb来显示segfault的来源。

其他注意事项:

  1. root分配新节点后,应将值分配回给您之所以没有这样做,是因为您缺少了c ++的基本原理之一。也就是说,它基于c。关于c的事情严格来说是一个“按值”函数/方法调用范例。因此,函数调用中的所有参数都是按值。当您传递根的内存地址时,实际上是在复制指针的值。然后,您只更新本地值。您需要将其分配回根目录。如果您想从头到尾学习该概念,我强烈建议您观看斯坦福大学的杰里·凯恩(Jerry Cain)的《编程范例》课程
  2. 在主函数中,应尝试将符号名称保持为小写而不是CamelCase。这有助于区分变量与类型(类型应保留为CamelCase)。
  3. 在TreeType :: insert方法中,应该调用变量tree_node而不是tree。这样做有助于反映正确的类型并避免混淆。
  4. 只要有可能,请尝试使用this->rootthis->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/0321563840http://www.amazon.com/Programming-语言2nd-Brian-Kernighan / dp / 0131103628它将节省您数小时,数小时的麻烦。从源头学习之后,编程也将变得更加有趣,因为您了解了其中的大部分概念。而且,事实是,当您具有一定水平的能力时,事情会变得更加有趣。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章