我编写了以下函数来找出二进制搜索树中任何路径的最小总和:
if
虽然上面的代码生成了正确的输出,但我觉得我没有利用它是二进制搜索树(BST)而不仅仅是二叉树这一事实。
在BST中,左子节点小于根节点和右节点,所以逻辑上我们只能考虑每个根的左子节点;但是如果BST右边只有一个孩子(比如说值10)和左边有多个子节点(总和> 10)会怎样?
在这种情况下,最小金额为10(在右边)。
如果可以,我将如何利用BST属性?还有,我可以在我的方法中使用的任何其他优化吗?
注意:编辑代码以解决错误;
答案 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上查看两种方法的比较 正如您所看到的,第二个功能并没有探索所有不乐观的树木。