我是C ++的新手。最初是Java开发人员
我用C ++创建了一个二叉树。 它添加了添加值和打印值的方法。
但是在某个地方我犯了一些错误,并且在printNode()方法中有一个指向自身的指针
我在下面粘贴我的代码。 谁能帮助我找出我犯的错误
#include <iostream>
#include <newbinarytree.cpp>
using namespace std;
int main()
{
NewBinaryTree* newtree;
NewBinaryTree tree;
newtree = &tree;
newtree->add(10);
newtree->add(11);
newtree->add(7); **-->ALL goes well til here & debugger shows a proper tree**
newtree->printTree();**--> This method does not print the tree values properly**
return 0;
}
#include <iostream>
using namespace std;
class Node{
public:
int data;
Node* left =NULL;
Node* right =NULL;
Node(int d){
data = d;
}
};
class NewBinaryTree{
private:
Node* root = NULL;
public:
NewBinaryTree(){
cout<<"Inside NewBinaryTree constructor";
}
void add(int dt){
if(root ==NULL){
Node node(dt);
root = &node;
}else{
addAsChildOf(root,dt);
}
}
void addAsChildOf(Node* tnode,int dt){
if(dt < tnode->data){
if(tnode->left == NULL){
Node newnode = Node(dt);
tnode->left = &newnode;
}else{
addAsChildOf(tnode->left,dt);
}
}else{
if(tnode->right == NULL){
Node newnode = Node(dt);
tnode->right = &newnode;
}else{
addAsChildOf(tnode->right,dt);
}
}
}
void printTree(){
if(root==NULL){
cout<<"empty tree";
}else{
printNode(this->root);
}
}
void printNode(Node* node1){ **--> This method goes into infinite loop**
if(node1==NULL){
return;
}else{
cout<<node1->data<<"[";
if(node1->left != NULL){
cout<<"Left:";
printNode(node1->left);
}
if(node1->right != NULL){
cout<<"Right:";
printNode(node1->right);
}
cout<<"]";
}
}
};
10[Left:4210843[]Right:2686564[Left:2686564
[Left:2686564[Left:2686564[Left:2686564[Left:2686564[Left:2686564[Left:2686564[Left:.... an so on
答案 0 :(得分:2)
您的add
方法在newbinarytree.cpp
中是错误的。您正在创建一个临时Node
对象,该对象会在范围退出时自动销毁。这导致不确定的行为,解释了为什么从printTree
方法中获取虚假值。 (我认为通常会出现一条警告通知您创建临时对象。)这就是我修改add
方法的方法。
void add(int dt){
if (root == NULL) {
Node *node = new Node(dt);
root = node;
} else {
addAsChildOf(root,dt);
}
}
您应该对addAsChildOf
方法执行相同的操作,因为它使用了相同的错误方式来构造和添加新节点。
要更好地了解代码为何无效:
if (root == NULL) {
Node node(dt); // construct Node object. All is well.
root = &node; // set Node object. All is well.
} // end of scope. Node is destructed. Not well.
此外,在将指针设置为空指针时,请使用nullptr
。记住还要delete
动态分配的节点,以防止内存泄漏。
希望这会有所帮助。