【发布时间】:2017-01-22 19:43:34
【问题描述】:
我编写了以下函数来找出二叉搜索树中任何路径的最小总和:
int minSumPath(TreeNode* root) {
if(root==NULL)
return 0;
int sum = root->value;
if(root->left!=NULL && root->right!=NULL)
sum += min(minSumPath(root->left),minSumPath(root->right));
else
if(root->left==NULL)
sum += minSumPath(root->right);
else
sum += minSumPath(root->left);
return sum;
}
虽然上面的代码生成了正确的输出,但我觉得我没有利用它是二叉搜索树 (BST) 而不仅仅是二叉树的事实。
在BST中,左子节点小于根节点和右节点,所以逻辑上我们只能考虑每个根节点的左子节点;但是如果 BST 在右侧只有一个子节点(比如值为 10)而左侧有多个子节点(总和 >10)怎么办?
在这种情况下,最小总和为 10(位于右侧)。
如果有的话,我将如何利用 BST 属性?另外,我可以在我的方法中使用任何其他优化吗?
注意:编辑代码以解决错误;
【问题讨论】:
-
@user3112926,虽然我完全同意您的观点,先生,但我正在寻求算法改进。
-
我不知道为什么我看不到函数返回除零以外的任何值。
-
作为一个不错的代码改进:由于您已经检查了
root以获取NULL,因此您可以省略其他级别的空检查,只需使用NULLs 调用minSumPathleft或right. -
是的,但在下一个递归步骤中,
root->left和root->right将是新的root,它再次检查NULL。 -
这个问题很有趣。一定有办法利用 BST 的结构。
标签: c++ algorithm performance optimization binary-search-tree