在C中查找BST中的奇数/偶数/负数的数量

时间:2018-01-02 08:48:56

标签: c recursion binary-search-tree

我正在写一个能找到BST中奇数/偶数/负数的函数。传入树和指向函数的指针。

int countIf (treelink tree, int (*pred)(TreeItem)) {
    if ( tree == NULL ) return 0;
    return (*pred)(tree->item) + countIf(tree->left,pred) + countIf(tree->right,pred);
}

函数指针pred可以是:

int isEven (TreeItem n) {
return !(n%2);
}

int isOdd (TreeItem n) {
    return n%2;
}

int isNegative (TreeItem n) {
    return (n < 0);
}

为什么countIF的代码不起作用?它只适用于某些情况,而不是全部。 谢谢

正在使用这组数字:7 5 11 3 6 9 15 1 4 8 10 14 16 但不是这样:7 -5 11 -9 3 10 15 1 4 8 14 16 6

1 个答案:

答案 0 :(得分:0)

如果n % 2为否定,则-1的结果为n。然后当你使用isOdd而不是负数时,每个负奇数将从总数中减去

至少有3种可能的修复方法:

  • 使用& 1(假定2&#39;补充)
  • 使用!!将其反转为布尔值,然后再次反转(将强制它为0或1)
  • 计算绝对值的模​​数:abs(n) % 2。这适用于超过2的模数。如果系统使用2的补码且值等于INT_MIN,则不起作用(感谢@ user694733)。
  • 计算余数的absabs(n % 2),即使在INT_MIN案例中也应该有效。

(-1) % 2生成-1的原因在于C11 6.5.5p6

  
      
  1. 当整数被分割时,/运算符的结果是代数商,丢弃了任何小数部分。如果商a/b可表示,则表达式(a/b)*b + a%b应等于a;否则,a/ba%b的行为都是未定义的。
  2.   

现在,给定a = -1b = 2截断意味着(-1) / 2生成-0.5并且小数截断,效果与将舍入为零,因此结果为0。现在,因为((-1) / 2) * 2 + (-1) % 2必须等于-1;并且(-1) / 2为0,因此((-1) / 2) * 2为0,然后0 + (-1) % 2(-1) % 2,规则必须评估为-1