我有一个关于插入树的数据并通过NLR方法打印出来的C++代码。但是在插入数据之后,我不能使用菜单中的命令2打印树。
我知道这个问题是在“insertTree”的某个地方,但我不知道如何修复它
struct node {
int data;
node* left;
node* right;
};
void insertTree(node* t, int x) {
//if the node to add is root
if (t->data == NULL) {
node* p = new node();
p->data = x;
p->left = NULL;
p->right = NULL;
t = p;
}
else {
//if the added element is less than t
if (t->data > x) {
insertTree(t->left, x);//add the element to the left of t
}
else if(t->data < x) {
insertTree(t->right, x);//add the element to the left of t
}
}
}
void duyet_NLR(node* t) {
if (t->data != NULL) {
cout << t->data << " ";
duyet_NLR(t->left);
duyet_NLR(t->right);
system("pause");
}
}
1条答案
按热度按时间lb3vh1jj1#
程序中至少存在两个(或三个)大问题:
if (t->data == NULL)
或if (t->data != NULL)
的检查都是错误的。需要检查**t
**是否为空指针。t->data
是int
,不应与NULL
进行比较。另外,不要在C++中使用NULL
。使用nullptr
。在这种情况下,它会帮助您,因为如果您使用nullptr
而不是NULL
,程序将无法编译。insertTree
中的node*
t
是函数的本地值。您对它所做的任何更改对函数的调用者(即在menu
中)都不可见。这可以通过引用指针来改变:menu
中也存在上述问题。当menu
返回到main
时,main
中的指针仍然是空指针-所以你不能删除所有的节点。在这里做同样的修改:使用递归来插入节点可能不是问题,但是您可以通过在
insertTree
中循环找到插入点来避免这个问题。示例:Demo
您还需要添加一个函数来释放所有分配的内存。