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

2023-12-21

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

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 财产?另外,我的方法中还可以使用其他优化吗?

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


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

举个例子:

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 http://melpon.org/wandbox/permlink/ecnBSzdD9BvDwlmL.
正如您所看到的,第二个函数不会探索所有没有希望的树。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在二叉搜索树中查找最小和的算法改进 的相关文章

  • 在实体框架拦截器中向 DbScanExpression 添加内部联接

    我正在尝试使用实体框架 CommandTree 拦截器通过 DbContext 向每个查询添加过滤器 为了简单起见 我有两个表 一个称为 User 有两列 UserId 和 EmailAddress 另一个称为 TenantUser 有两列
  • 在 C# 中按元素相乘数组具有意想不到的性能

    我想找到按元素相乘两个数组的最佳方法 这是更广泛项目的一部分 其中性能而不是唯一的考虑因素 我今天开始用 C Linqpad 编写一些函数 因此它还没有以任何方式进行优化 下面代码的输出如下 Environment ProcessorCou
  • 如何在 C# / .NET 中创建内存泄漏[重复]

    这个问题在这里已经有答案了 可能的重复 托管代码中是否可能存在内存泄漏 特别是 C 3 0 https stackoverflow com questions 6436620 is it possible to have a memory
  • 使用多级解决方案计算二维网格中的最近邻

    我有一个问题 在 x y 大小的网格中 我提供了一个点 并且我需要找到最近的邻居 在实践中 我试图在 pygame 中找到距离光标最近的点 该点跨越颜色距离阈值 计算如下 sqrt rgb1 0 rgb2 0 2 rgb1 1 rgb2 1
  • 平滑滚动.net 表单

    您好 我正在 net 中使用表单 并且在运行时动态添加大量链接标签 我将这些链接标签添加到面板并将该面板添加到 winform 当链接标签的数量增加时 表单会显示一个自动滚动条 垂直 现在 当我使用自动滚动向下滚动时 表单在滚动时不会更新其
  • PhoneGap 1.4 封装 Sencha Touch 2.X - 性能怎么样?

    我正在构建一个多平台平板电脑应用程序 仅使用其 Webview 使用 Phonegap 1 4 对其进行包装 然后使用 Sencha Touch 2 框架发挥我的魔力 我所说的多平台是指 iOS 5 X 和 Android 3 0 目前 到
  • 防止 boost::asio::io_context 在空轮询调用时停止

    此代码调用发布的句柄 boost asio io context ioc boost asio post ioc std cout lt lt lol lt lt std endl ioc poll 而这并没有 boost asio io
  • 根据 N 个值中最小的一个返回不同的结果

    不确定如何使标题更具描述性 所以我只是从一个例子开始 我使用下面的代码位 它从枚举中选择一个方向 具体取决于四个轴中哪一个与给定方向相比形成最小角度 static Direction VectorToDirection Vector2 di
  • 找不到 assimp-vc140-mt.dll ASSIMP

    我已经从以下位置下载了 Assimp 项目http assimp sourceforge net main downloads html http assimp sourceforge net main downloads html Ass
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • 为什么 set_symmetry_difference 无法与比较器一起使用?

    Example program include
  • AES 输出是否小于输入?

    我想加密一个字符串并将其嵌入到 URL 中 因此我想确保加密的输出不大于输入 AES 是可行的方法吗 不可能创建任何始终会创建比输入更小的输出的算法 但可以将任何输出反转回输入 如果您允许 不大于输入 那么基本上您只是在谈论同构算法alwa
  • 如何在c的case语句中使用省略号?

    CASE expr no commas ELLIPSIS expr no commas 我在c的语法规则中看到了这样的规则 但是当我尝试重现它时 int test float i switch i case 1 3 printf hi 它失
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • cout 和字符串连接

    我刚刚复习了我的 C 我尝试这样做 include
  • 如何在 DropDownList 中保留空格 - ASP.net MVC Razor 视图

    我在视图中通过以下方式绑定我的模型 问题是我的项目文本是格式化文本 单词之间有空格 如下所示 123 First 234 00 123 AnotherItem 234 00 123 Second 234 00 我想保留此项目文本中的空格 即
  • 将 char[][] 转换为 char** 会导致段错误吗?

    好吧 我的 C 有点生疏了 但我想我应该用 C 来做我的下一个 小 项目 这样我就可以对其进行抛光 并且我已经有不到 20 行的段错误了 这是我的完整代码 define ROWS 4 define COLS 4 char main map
  • C++0x中disable_if在哪里?

    Boost 两者都有enable if and disable if 但 C 0x 似乎缺少后者 为什么它被排除在外 C 0x 中是否有元编程工具允许我构建disable if按照enable if 哦 我刚刚注意到std enable i
  • xsi:type 属性搞乱了 C# XML 反序列化

    我使用 XSD exe 根据 XML 架构 xsd 文件 自动生成 C 对象 我正在反序列化 OpenCover 输出 但其中一个部分类未正确生成 这是导致异常的行

随机推荐

  • 如果无法修改 JSONP 中的标头。 Chrome 中的 Twitter 扩展程序如何工作?

    现在我正在用 Javascript 做 Twitter 客户端 读完这个话题后 我有一个疑问 修改 JSONP 请求的 HTTP 标头 https stackoverflow com questions 3350778 modify htt
  • 获取地址时模板类型(类/函数)实例化的规则是什么?

    在回答中this https stackoverflow com questions 6734492 c callback to function template explicitly instantiate template问题 我发现
  • 核心数据:继承、STI 还是其他?

    我似乎无法在文档中或通过谷歌找到任何关于此的信息 但如果有的话 指向它的指针会很棒 在我的应用程序中 我有一个Thing作为核心数据类 我打算拥有那个Thing包含许多Items 里面有很多字段 比如order and created da
  • 在 macOS 中找不到 mysql 命令

    我已经安装了 MySQL dmg根据官方页面安装文件 但它返回command not found mysql当我执行时mysql命令 如何解决这个问题 MySQL 的文档说 使用软件包安装程序进行安装时 文件将安装到 usr local 中
  • setuid 与 seteuid 函数

    setuid 和 seteuid 函数有什么区别 在手册页中 这两个函数都有相似的描述 setuid DESCRIPTION setuid sets the effective user ID of the calling process
  • 如何在运行时更改 WinForms 应用程序的区域性

    我用 C 创建了 Windows 窗体程序 我在本地化方面遇到一些问题 我有两种语言的资源文件 一种是英语 另一种是法语 我想单击每个语言按钮并在运行时更改语言 但是当我点击按钮时 它不起作用 我正在使用这个代码 private void
  • 如何为 Azure AD B2C 设置用户旅程查看器

    根据Azure Active Directory B2C 收集日志 https learn microsoft com en us azure active directory b2c active directory b2c troubl
  • 您认为 Java 中最好的 CMS 是什么 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Rails 3:如何在 application.rb 中声明 Rack 中间件

    很多例子 比如这两个 如何在 Rails3 中使用机架中间件 https stackoverflow com questions 4224900 how to use rack middleware with rails3 http asc
  • VueJS 将 HTML 打印到页面

    我有一个属性 其中包含 HTML 字符串作为其属性之一 当我尝试将其打印到模板中的页面时 它实际上打印了 HTML 因此文本包含 HTML 标签 并且它本身不会被浏览器解释为 HTML 我怎样才能解决这个问题 模板 div class de
  • 无法在 Android 8 中禁用通知振动

    我试着禁用振动显示通知时 Func public static Notification buildNotifForUploaderService Context ctx String title String message Notifi
  • Pandas 数据框按日期移动列

    我有一个按日期和 ID 索引的面板数据集 看起来像这样 df pd DataFrame Date 2005 12 31 2006 03 31 2006 09 30 2005 12 31 2006 03 31 2006 06 30 2006
  • 绕过错误并继续代码

    这是我之前遇到的一个简单问题 本质上 像这样的解决方案 https stackoverflow com questions 574730 python how to ignore an exception and proceed and t
  • 在 Android 上替换 ViewPager 中的当前 Fragment

    我有一个ViewPager我必须更换第一个Fragment如果某个动作发生 public static class PagerAdapter extends FragmentStatePagerAdapter private TempCha
  • 如何添加可拖动的“文本字段”以在颤振中的图像上添加文本?

    我正在 flutter 中创建一个 Meme 生成器应用程序 我只需要知道是否有一种方法 用户本身可以在图像上添加文本并将该文本拖动到图像区域中的任何位置 这样图片看起来很有趣 我尝试过拖动框小部件 但不知道如何将其用于文本字段 这样我也可
  • SQL 2008+ NOLOCK 与 READPAST 对于报告准确性的注意事项

    了解最终的决策是业务决策 在 SQL 2008 R2 中运行的 NOLOCK 和 READPAST 之间的准确性考虑因素是什么 在与业务领域讨论变更之前 我希望能有更好的理解 我继承了许多查询 用于创建管理报告的数据视图 WITH NOLO
  • iPhone:获取 Google 地图的选定缩放级别

    当用户使用以下任一方式时 我们需要获取 MKMapView 当前选择的缩放级别 使用 Mapkit 放大或缩小 Google 地图 我们尝试过的解决方案在模拟器上运行良好 但在真实环境中运行不佳 设备 具有 iOS 3 0 1 的 iPho
  • 将 NLTK Rake 应用于 Dataframe 中的每一行

    我想应用 Rake 函数 https pypi org project rake nltk https pypi org project rake nltk 到我的数据框中的每一行 我可以将该函数单独应用于特定行 但不能将其附加到数据帧 这
  • Solr 索引中缺少 Id 字段

    我刚刚发现我的 Solr 索引不包含 id场地 并且无法获取项目 id UniqueId 存在 但这并不是真正有用 public class MyClass IndexField BuiltinFields UniqueId public
  • 在二叉搜索树中查找最小和的算法改进

    我编写了以下函数来找出二叉搜索树中任何路径的最小总和 int minSumPath TreeNode root if root NULL return 0 int sum root gt value if root gt left NULL