2013-12-07 104 views
4

二叉树插入:二叉树实现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++,这是使插入二叉树的代码。

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

有人可以告诉我我错了吗?

+3

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

回答

10

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

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

其他一些注意事项:

  1. 你分配的新节点后,您应该指定值回root。你没有这样做,因为你错过了C++的基本原理之一。也就是说,它基于c。关于c的事情是严格意义上的“按值”函数/方法调用范例。所以函数调用中的所有参数都是按值定义的。当你传入root的内存地址时,实际上是在复制指针的值。然后,您只更新本地值。您需要将其分配回根目录。如果你想从前到后学习这个概念,我强烈建议你看看Jerry Cain's Programming Paradigms course at Stanford
  2. 在你的主函数中,你应该尽量保持符号名称为lower_case而不是CamelCase。这有助于区分变量类型(类型应该保持CamelCase)。
  3. 在你的TreeType :: insert方法中,你应该调用变量tree_node而不是树。这样做有助于反映正确的类型并避免混淆。
  4. 只要可能,请尝试使用this->rootthis->insert表示法。如果您不小心创建了一个本地范围的变量,它不仅会正确解决,而且对于定义数据或方法的读者来说也更加清晰。伟大的编码就是沟通。读者可能只需要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。它可以节省您的时间,几小时,几小时。从源头获知后,编程也更加愉快,因为你理解了很多概念。而事实是,如果你有足够的能力,事情会变得更有趣。

1

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

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

尝试像这个 -

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); 
}; 
+0

你应该使用'void Insert(Node ** node,int value)',否则你不能创建根节点... – albin