c - 查找元素在树中的级别
问题描述
所以我遇到了这个问题,我应该在树中找到元素的级别。似乎没有任何效果,所以我在这里寻求帮助。
这就是我到目前为止所得到的。这里的问题是第 4 个断言(返回的级别应该是 2)不起作用并且断言被警告。我想过也许尝试不递归地这样做,但那怎么能做到呢?
int findElementLevel(const BSTree tree, const int element) {
int level = 0;
if (tree == NULL) {
return -1;
}
if (tree->data == element) {
return level;
}
if (element < (tree)->data) {
level++;
findElementLevel(tree->left, element);
return level;
}
if (element > (tree)->data) {
level++;
findElementLevel(tree->right, element);
return level;
}
}
void testNewTree(void) {
BSTree tree = emptyTree();
assert(isEmpty(tree));
int arr[5] = {3,2,5,1,4}, i;
for (i = 0; i < 5; i++)
{
insertSorted(&tree, arr[i]);
}
assert(findElementLevel(tree, 3) == 0);
assert(findElementLevel(tree, 2) == 1);
assert(findElementLevel(tree, 5) == 1);
assert(findElementLevel(tree, 1) == 2);
assert(findElementLevel(tree, 4) == 2);
}
解决方案
该函数始终从设置为 0 的局部变量 level 的声明开始。
int findElementLevel(const BSTree tree, const int element) {
int level = 0;
如果在任何实际级别中找到目标元素,则返回此值为 0(或由于在当前递归函数调用中增加而为 1)的值
if (tree->data == element) {
return level;
}
你必须积累水平。
例如,可以通过以下方式定义递归函数
int findElementLevel(const BSTree tree, const int element) {
if (tree == NULL) {
return -1;
}
else if ( element < tree->data ) {
int level = findElementLevel(tree->left, element);
return level == -1 ? level : level + 1;
}
else if ( tree->data < element ) {
int level = findElementLevel(tree->right, element);
return level == -1 ? level : level + 1;
}
else {
return 0;
}
}
请注意,第二个参数的限定符 const 没有多大意义,因为该函数处理所提供参数的值的副本。该函数可以像这样声明
int findElementLevel(const BSTree tree, int element);
推荐阅读
- flutter - 显示材质对话框,未找到材质本地化
- python - 有没有办法链接生成器表达式,以便下游条件防止评估未经检查的上游元素?
- flutter - 在 FIutter 中:登录和注册都有一个屏幕,当我在它们之间切换时,我未能使卡的高度灵活
- flutter - 如何在颤动中清除listviewbuilder中的对象?
- python - 如何在python中编写复杂的排序?
- android - 如何取消应用程序在后台运行时收到的通知?
- angular - 从角度发送承载令牌时出现CORS问题
- c++ - MSVC - C2668 对重载函数的模棱两可调用 - 它是编译器错误吗?
- java - JavaFX 中的多个 setOnAction 清理并在 5 个问题后停止应用程序
- android - Android:如何将自定义布局设置为透明