【问题标题】:Tree traversal function with returning value带返回值的树遍历函数
【发布时间】:2022-01-17 18:27:48
【问题描述】:

我有这个函数来检查从节点到叶子的路径的键总和是否总是低于某个值 k,如果不是这样,则将标志设置为 1 以跟踪它。

是否可以将此函数设为 int 或 bool 类型,如果 sum 总是 = k 的情况下不使用我正在做的标志,则返回 1?

int flag=0;
void checkSum(Node node,int sum,int k){
    if(node==nullptr){
        return;
    } 
    sum=sum+node->key;
    if(node->left==nullptr && node->right==nullptr){
        if(sum>=k){
            flag=1;
        }
        return;
    }
    checkSum(node->left,sum,k);
    checkSum(node->right,sum,k);
    
}

【问题讨论】:

  • flag 设置为 1 后会发生什么?你算不算。是这样的路径还是其他什么?
  • @nice_dev 我只需要知道执行 checkSum 后标志是设置为 1 还是 0

标签: algorithm binary-tree tree-traversal


【解决方案1】:

怎么样:

bool checkSum(Node *node, int sum, int k){
    if (node == nullptr) return true;
    sum += node->key;
    if (sum >= k) return false;
    return checkSum(node->left, sum, k) && checkSum(node->right, sum, k);
}

如果你在没有返回 false 的情况下到达 nullptr,因此在路径上没有超过 k,你可以将 true 返回给调用者。如果在任何时候总和超过 k,您可以返回 false,这将使进一步的递归调用短路并由于 && 运算符而一直传播回根。因此,树以 dfs 方式进行探索,并在路径和超过 k 时返回 false 回到根,否则返回 true。

但是,此实现假设非负节点键。如果不能假设,这样您真的只想检查叶节点的总和,您可以将其修改为:

bool checkSum(Node *node, int sum, int k) {
    if (!node->left && !node->right)
        return sum < k;
    sum += node->key;
    return checkSum(node->left, sum, k) && checkSum(node->right, sum, k);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-21
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 2013-07-09
    • 2020-06-18
    相关资源
    最近更新 更多