节点之和大于BST中的数字

时间:2017-08-02 22:20:51

标签: c algorithm binary-search-tree

对于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时如何处理这种情况。

3 个答案:

答案 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;
}