c - 这个从 BST 中删除节点的函数有什么问题?
问题描述
我只是想从 BST 中删除一个节点,这给了我一个新的未定义的错误。ADT 是这样的:
typedef struct BSTNode *BSTree;
struct BSTNode {
int value;
BSTree left;
BSTree right;
};
BSTree Delete(BSTree t, int item) {
if (item < t->value) {
t->left = Delete(t->left, item);
} else if (item > t->value) {
t->right = Delete(t->right, item);
} else {
// deleting item
if (t->left == NULL && t->right == NULL) {
BSTree new = NULL;
} else if (t->left == NULL) {
BSTree new = t->right;
} else if (t->right == NULL) {
BSTree new = t->left;
// } else {
//BSTree new = joinTrees(t->left, t->right);
}
free(t);
t = new;
}
解决方案
问题是您声明了仅存在于每个包含条件块中的多个变量。在函数顶部或else
块顶部声明变量。然后在每个条件代码块中设置相同的变量。
BSTree Delete(BSTree t, int item) {
BSTree new_item;
if (item < t->value) {
t->left = Delete(t->left, item);
} else if (item > t->value) {
t->right = Delete(t->right, item);
} else {
// deleting item
if (t->left == NULL && t->right == NULL) {
new_item = NULL;
} else if (t->left == NULL) {
new_item = t->right;
} else if (t->right == NULL) {
new_item = t->left;
// } else {
//BSTree new = joinTrees(t->left, t->right);
}
free(t);
t = new_item;
}
推荐阅读
- java - 在 Kafka 中,是否可以对来自一个主题的选择性分区进行复制?
- xml - XPath 版本(1.0、2.0、3.1)之间有什么区别
- hyperledger-fabric - fabric-samples:无法生成 orderer 创世块
- javascript - 在每次页面加载时在 Angular 6 中重新加载 JavaScript 文件
- java - 构建 Apache 时对 XML_GetErrorCode(和其他)的未定义引用
- sql - 查看 cte 或 temp 表?
- angular - 在角度使用 HttpClient
- android-studio - 为 apk 文件编写 espresso 测试
- ios - textField.shouldChangeCharactersIn 不使用盲文屏幕输入调用
- javascript - axios 没有在 vue js cli 中定义