typedef struct treeNode {
treeNode* left;
treeNode* right;
int data;
treeNode(int d) {
data = d;
left = NULL;
right = NULL;
}
}treeNode;
void insert(treeNode *root, int data) {
if (root == NULL) {
cout << &root;
root = new treeNode(data);
}
else if (data < root->data) {
insert(root->left, data);
}
else {
insert(root->right, data);
}
}
void inorderTraversal(treeNode* root) {
if (root == NULL)
return;
inorderTraversal(root->left);
cout<<root->data;
inorderTraversal(root->right);
}
int main() {
treeNode *root = new treeNode(1);
cout << &root << endl;
insert(root, 2);
inorderTraversal(root);
return 0;
}
所以我很累,但是我正在为面试准备工作提出一些练习题,并且出于某种原因,这个BST插件没有打印出任何节点被添加到树中。它可能是我用指针掩盖的东西,但我无法弄明白。任何想法?
答案 0 :(得分:4)
void insert(treeNode *root, int data) {
if (root == NULL) {
cout << &root;
root = new treeNode(data);
}
一旦函数结束,对root
的更改就会丢失,它不会修改作为参数传递的root
,而是修改它自己的副本。
答案 1 :(得分:2)
请注意,当你插入节点时,使用指向指针(仅指针是不够的): 所以,这是固定代码:
void insert(treeNode **root, int data) {
if (*root == NULL) {
cout << root;
*root = new treeNode(data);
}
else if (data < (*root)->data) {
insert(&(*root)->left, data);
}
else {
insert(&(*root)->right, data);
}
}
主要是:
int main() {
treeNode *root = new treeNode(1);
cout << &root << endl;
insert(&root, 2);
inorderTraversal(root);
return 0;
}
答案 2 :(得分:0)
你的逻辑是正确的!
唯一的问题是,当您创建局部变量时,即使它是指针,其范围也是函数的本地变量。在你的主要:
...
insert(root, 2);
...
函数调用发送root
的副本,该副本是指向treeNode
的指针(不是root
的地址)。请注意
void insert(treeNode *root, int data)
获取treeNode
指针作为参数(不是指针的地址)。 注意:此函数调用可能看起来像“通过指针调用”(或引用),但它实际上是“按值调用”。您在main函数中定义的root
和root
方法中的insert
在堆栈(内存)中具有不同的地址,因为它们是不同的变量。前者在内存中的主函数堆栈中,而后者在insert
方法中。因此,一旦函数调用insert
完成执行,其堆栈就会被清空,包括局部变量root
。有关内存的更多详细信息,请参阅:stacks/heaps。
当然,您使用以下内容分配的内存中的数据:
*root = new treeNode(data);
仍然停留在堆中,但是一旦你离开insert
函数,你就失去了对它的引用(地址)。
解决方案将原始root
的地址传递给该函数并进行修改( K-ballo 和 dip 已建议)或从函数返回修改后的本地root
。对于第一种方法,请参阅他/她的答案中 dip 所写的代码。
我个人更喜欢从函数中返回修改后的root
,因为我觉得它更方便,特别是在实现其他常见的BST算法时。这是您的功能,稍微修改了原始代码:
treeNode* insert(treeNode *root, int data) {
if (root == NULL) {
root = new treeNode(data);
}
else if (data < root->data) {
root->left=insert(root->left, data);
}
else {
root->right=insert(root->right, data);
}
return treeNode;
}
main中的函数调用将是:
int main() {
treeNode *root = new treeNode(1);
cout << &root << endl;
root = insert(root, 2);
inorderTraversal(root);
return 0;
}
希望有所帮助!