对于C中无法更改的二进制搜索树结构:
struct bstnode {
int item;
struct bstnode* left;
struct bstnode* right;
};
struct bst {
struct bstnode* root;
};
我们如何找到大于数字(num)的值的总和?
(我们不能遍历整个树或将此bst转换为数组)
函数声明是:
int sum_greater(struct bst * t, int num)
基本上,我的方法是使用递归:
当num等于当前节点中的item时,我们将该树的右侧部分相加
当num大于当前节点中的item且node-> right大于num时,我们将该树的右侧部分相加。
但我不知道当前节点小于num时如何处理这种情况。
答案 0 :(得分:0)
你让这有点太复杂了。您的基本案例是命中叶子节点(您已经知道如何处理)。你有三个递归案例:
current > num
result = current +
recur on right child +
recur on left child
current = num
result = current +
recur on right child
current < num
result = recur on right child
return result
你所能做的就是修剪掉你发现它们太小的左子树。不要浪费未来的努力:递归会很好地处理。
请注意,无法提前停止依赖于正确的孩子的价值:该孩子可能拥有任意大值的右后代。
答案 1 :(得分:0)
所以用户@Prune已经指出了这个想法,其中包括乘坐小于预期值的子树。
int sum_greater(struct bst * t, int num){
struct bstnode *ptr = t->root;
if(!ptr)
return 0;
struct bst right_tree = { t->root->right };
struct bst left_tree = { t->root->left };
if(ptr->item > num)
return ptr->item + \
sum_greater(&left_tree, num) + \
sum_greater(&right_tree, num);
else // ptr->item =< num
return sum_greater(&right_tree, num);
}
有关完整示例,请运行以下代码:Full sum_greater code
答案 2 :(得分:0)
如何处理当前节点小于num的情况。
当前节点小于或等于至num
时,仅在此情况下添加右 BST。否则,添加左,右和->item
。
int BST_sum_gt(const struct bstnode* node, int num) {
if (node == NULL) {
return 0;
}
if (node->item > num) {
return BST_sum_gt(node->left) + node->item + BST_sum_gt(node->left);
}
return BST_sum_gt(node->left);
}
int sum_greater(const struct bst * t, int num) {
return BST_sum_gt(t->root);
}
或者不那么递归的方法
int BST_sum_gt(const struct bstnode* node, int num) {
int sum = 0;
while (node) {
if (node->item > num) {
sum += BST_sum_gt(node->left) + node->item;
}
node = node->right;
}
return sum;
}