【问题标题】:Binary Tree implementation C++二叉树实现 C++
【发布时间】:2013-12-07 17:56:36
【问题描述】:

二叉树插入:

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

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

谁能告诉我哪里错了?

【问题讨论】:

  • 您是否尝试过使用调试器和/或 valgrind?

标签: c++ tree binary-tree


【解决方案1】:

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

在linux下编译时,可以使用gdb来显示段错误的来源。

其他一些注意事项:

  1. 您应该在分配新节点后将值分配回root。你没有这样做,因为你错过了 C++ 的基础之一。也就是说,它基于c。而关于 c 的事情是,它严格来说是一个“按值”函数/方法调用范例。所以函数调用中的所有参数都是按值计算的。当你传入 root 的内存地址时,你实际上是在复制指针的值。然后,您只更新本地值。您需要将其分配回根目录。如果您想从头到尾了解这个概念,我强烈建议您观看Jerry Cain's Programming Paradigms course at Stanford
  2. 在您的 main 函数中,您应该尽量将符号名称保留为小写而不是 CamelCase。这有助于区分变量和类型(类型应保持 CamelCase)。
  3. 在您的 TreeType::insert 方法中,您应该调用变量 tree_node 而不是 tree。这样做有助于反映正确的类型并避免混淆。
  4. 尽可能尝试使用this-&gt;rootthis-&gt;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-Language-2nd-Brian-Kernighan/dp/0131103628。它将为您节省数小时、数小时、数小时。在从源头学习之后,编程也变得更加有趣,因为您了解了大部分概念。而且,事实是,当你有相当的能力时,事情会更有趣。

【讨论】:

    【解决方案2】:

    试试这样的-

     struct Node {
        int Data;
        Node* Left;
        Node* Right; 
    };
    
    Node* Find( Node* node, int value )
    {
        if( node == NULL )
            return NULL;
        if( node->Data == value )
            return node;
        if( node->Data > value )
            return Find( node->Left, value );
        else
            return Find( node->Right, value );
    };
    
    void Insert( Node* node, int value )
    {
        if( node == NULL ) {
            node = new Node( value );
            return;
        }
        if( node->Data > value )
            Insert( node->Left, value );
        else
            Insert( node->Right, value );
    };
    

    【讨论】:

    • 你应该使用'void Insert(Node** node, int value)',否则你无法创建根节点...
    【解决方案3】:

    在您的 TreeType 构造函数中,我认为您应该明确地将根指向 NULL。

    TreeType::TreeType() {
      root = NULL;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-03
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多