我在这个二叉树程序中做错了什么

时间:2015-11-19 13:41:17

标签: c++ binary-tree

#include <iostream>

using namespace std;

struct node{
    int data;
    node *left;
    node *right;
};

node *root ;
node *newnode;

void insert( node **root , int value){
    newnode = *root;

    if ( newnode == NULL ){
        newnode = new node;
        newnode->left = NULL;
        newnode->right = NULL;
        newnode->data  = value;
    }
    else if ( value < newnode->data ){
        insert( &newnode->left , value );
    }
    else if ( value > newnode->data  ){
        insert ( &newnode->right , value );
    }
}

int main(){

    node *p = root;
    insert ( &root , 4);
    insert ( &root , 5);
    insert ( &root , 2 );

    cout << root->data << endl;
    //inorder( root );
}

提供此错误

    [main] C:\Users\abc\Documents\QueueUsingLinkedList.exe 1336 (0)      handle_exceptions: Exception: STATUS_ACCESS_VIOLATION
    [main] QueueUsingLinkedList 1336 (0) handle_exceptions: Dumping stack trace to QueueUsingLinkedList.exe.core
    [Finished in 0.7s]

我从过去一小时开始制作这个二叉树...我在互联网上看过程序,但我不知道这个程序有什么问题。

3 个答案:

答案 0 :(得分:1)

您永远不会更改rootinsert()的值:

if ( newnode == NULL ){
    newnode = new node;
    newnode->left = NULL;
    newnode->right = NULL;
    newnode->data  = value;
    *root = newnode; // the root is the newly create node...
}

同时将root初始化为NULL

答案 1 :(得分:1)

如果你将程序结构化得更多,有一些事情会更清楚:

  

1 - 你应该使用构造函数!

structclass es都可以定义构造函数,因此您应该使用它们:从长远来看,它们将为您节省大量代码。

struct Node {
  int data;
  Node *left;
  Node *right;
  Node(int data) {
    this->data = data;
    left = NULL;
    right = NULL;
  }
  ~Node() {
    delete left;
    delete right;
  }
};
  

2 - 你应该有某种Tree类!

如果你有一个树类,你不需要担心传递一个根 - 假设你定义了正确的行为,类会为你照顾它。 ;)

class BinaryTree {
  public:
    BinaryTree() { root = NULL; }
    ~BinaryTree() { delete root; }
    bool insert(int inserted);
    Node* get_root() const { return root; }
  private:
    Node* root;
};
  

3 - 您的插入内容应返回bool

insertsearchremove等操作通常会返回bool - 这会让调用者知道它是否成功。在这种情况下,我将成功定义为insert具有唯一值的节点。

bool BinaryTree::insert(int inserted) {

    if(!root) {
        root = new Node(inserted);
        return true; // This is a unique value
    }
    else {
        Node *temp = root;

        while(temp) {
            if(inserted > temp->data) {
                if(temp->right)
                    temp = temp->right;
                else {
                    temp->right = new Node(inserted); // This is a unique value
                    return true;
                }
            } else if(inserted < temp->data) {
                if(temp->left) 
                    temp = temp->left;
                else {
                    temp->left = new Node(inserted); // This is a unique value
                    return true;
                }
            } else
                return false; // Not unique
        }
    }
    return false; // Just in case
}
  

4 - 一些小事

我建议使用structclass es的资本名称。实际上,使用UpperCamelCase命名它们是很传统的。变量应该是lowercasesnake_case - 我在代码中做了一些更改。有关更多样式建议,请查看the Google Style Guide for C++。这真的很好。

Here's the ideone.祝其余的实施好运。 :)

答案 2 :(得分:-1)

这应该可以解决问题:

node *root = NULL;

*rootnode = newnode;

编辑:

试试这个:

#include <iostream>

using namespace std;

struct node{
    int data;
    node *left;
    node *right;
};


void insert( node **rootnode , int value) {

    node* newnode = *rootnode;

    if ( newnode == NULL ) {
        newnode = new node;
        newnode->left = NULL;
        newnode->right = NULL;
        newnode->data  = value;
        *rootnode = newnode; // this was missing!
    }
    else if ( value < newnode->data ){
        insert( &newnode->left , value );
    }
    else if ( value > newnode->data  ){
        insert ( &newnode->right , value );
    }


}




int main(){

    node* root = NULL;

    insert ( &root , 4);
    insert ( &root , 5);
    insert ( &root , 2 );

    cout << root->data << endl;
}