【发布时间】:2019-12-13 07:39:01
【问题描述】:
我正在尝试使用以下结构创建将节点插入 BST 的方法:
// node structure
struct Node {
int val;
struct Node* left;
struct Node* right;
};
// binary tree structure
struct BinaryTree {
struct Node* root;
};
最初我创建了这个方法来向树中添加节点:
// add value to binary tree
void _AddNode(struct Node* node, int val) {
if (node == NULL)
*(&node) = CreateNode(val);
else if (val <= node->val)
_AddNode(node->left, val);
else
_AddNode(node->right, val);
}
void AddNode(struct BinaryTree* tree, int val) {
_AddNode(tree->root, val);
}
使用此函数构建树,当我尝试遍历、打印、访问树中的数据时,我收到 Segmentation fault: 11 错误。
但是,当我修改函数以传入双指针并有效地执行相同的操作时:
// add value to binary tree
void _AddNode(struct Node** node, int val) {
if (*node == NULL)
*node = CreateNode(val);
else if (val <= (*node)->val)
_AddNode(&(*node)->left, val);
else
_AddNode(&(*node)->right, val);
}
void AddNode(struct BinaryTree* tree, int val) {
_AddNode(&tree->root, val);
}
为什么后者有效,而前者无效。
【问题讨论】:
-
对于各种图形,我的常见建议是使用笔和纸来解决最常见的问题。在纸上画一棵树,用小方块作为节点,在方块内写下值,然后用箭头作为指针。通过擦除箭头并重新绘制它们来“重新排列”树。
-
在 "Originally I created" 代码中
*(&node)不正确。node(作为参数)被声明为函数的局部变量,等同于简单的node。 -
它们不一样——在第一种情况下你不能改变指针,而在第二种情况下你可以。
-
对不起,我在看“最初是我创建的”,应该更清楚。
-
与您的问题无关,但在 C 中,所有以下划线开头并后跟大写字母(如
_AddNode)的符号都是保留的。参见例如this reserved identifier reference了解详情。
标签: c pointers binary-tree