#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]
我从过去一小时开始制作这个二叉树...我在互联网上看过程序,但我不知道这个程序有什么问题。
答案 0 :(得分:1)
您永远不会更改root
中insert()
的值:
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 - 你应该使用构造函数!
struct
和class
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
insert
,search
和remove
等操作通常会返回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 - 一些小事
我建议使用struct
和class
es的资本名称。实际上,使用UpperCamelCase
命名它们是很传统的。变量应该是lowercase
或snake_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;
}