在二进制搜索树中查找最小和的算法改进

时间:2017-01-22 19:43:34

标签: c++ algorithm performance optimization binary-search-tree

我编写了以下函数来找出二进制搜索树中任何路径的最小总和:

if

虽然上面的代码生成了正确的输出,但我觉得我没有利用它是二进制搜索树(BST)而不仅仅是二叉树这一事实。

在BST中,左子节点小于根节点和右节点,所以逻辑上我们只能考虑每个根的左子节点;但是如果BST右边只有一个孩子(比如说值10)和左边有多个子节点(总和> 10)会怎样?

在这种情况下,最小金额为10(在右边)。

如果可以,我将如何利用BST属性?还有,我可以在我的方法中使用的任何其他优化吗?

注意:编辑代码以解决错误;

1 个答案:

答案 0 :(得分:1)

在某些情况下,知情搜索可能有所帮助 在最坏的情况下,计算成本与您的算法完全相同。

举个例子:

int minSumPathOpt(TreeNode* root) {
    if(root == nullptr) return 0;

    int sum = -1;

    std::stack<std::pair<TreeNode*, int>> todo;
    todo.push(std::make_pair(root, 0));

    while(not todo.empty()) {
        std::pair<TreeNode*, int> curr = todo.top();
        todo.pop();

        TreeNode *node = curr.first;        
        int part = curr.second + node->value;

        if(sum == -1 || part < sum) {
            if(!node->left && !node->right) {
                sum = part;
            } else  {
                if(node->right) todo.push(std::make_pair(node->right, part));
                if(node->left) todo.push(std::make_pair(node->left, part));
            }
        }
    }

    return sum;
}

基本思想是在执行DFS时跟踪当前最小值。只要其根值的总和已经大于当前最小值,这将使您有机会修剪整个子树。
此外,在查看正确的树之前探索左树可以帮助最大化结果(确实没有保证,但由于如何定义BST,这是一个好主意。)

wandbox上查看两种方法的比较 正如您所看到的,第二个功能并没有探索所有不乐观的树木。