【问题标题】:Shortest branch in a binary tree?二叉树中最短的分支?
【发布时间】:2009-08-28 04:07:08
【问题描述】:

可以使用lr 两个函数对二叉树进行编码 这样对于node n, l(n) 给出n, r(n) 的左孩子 给n的右孩子。

一棵树的分支是从根到叶子的路径, 分支到特定叶子的长度是 从根到叶的路径上的弧。

MinBranch(l,r,x) 是一个简单的递归算法 采用由 l 和 r 函数编码的二叉树 与二叉树的根节点 x 和 返回二进制最短分支的长度 树。

给出这个算法的伪代码。

好的,所以基本上这就是我到目前为止的想法:

MinBranch(l, r, x)
{
    if x is None return 0

    left_one = MinBranch(l, r, l(x))

    right_one = MinBranch(l, r, r(x))

    return {min (left_one),(right_one)}
}

显然这不是很好或完美的。如果我会很高兴 人们可以帮助我得到这个完美和工作 - 任何帮助 将不胜感激。

【问题讨论】:

  • 我会说你的版本很好,没有什么可添加的。
  • 顺便说一句,您还可以编辑昨天的问题 (stackoverflow.com/questions/1339043...)... 这样您就不必重新表述所有内容了。
  • -1 表示错误的标题,删除您的问题,并要求人们解决您的硬件问题,而不是询问一些特别困扰您的事情的提示
  • 你为什么要删除你的问题?

标签: algorithm binary-tree pseudocode


【解决方案1】:

我怀疑有人会直接为你解决家庭作业。一条线索:随着树变大,返回值肯定会变高,对吧?但是,除了 0 之外,我在您的函数中看不到任何数字文字,也没有加法运算符。您将如何返回更大的数字?

同一问题的另一个角度:任何时候你写一个递归函数,它有助于枚举“我应该停止调用自己的所有条件是什么?在每种情况下我返回什么?”

【讨论】:

    【解决方案2】:

    您的方法是正确的,但您并不完全在那里;您的递归算法将始终返回 0。(不过,逻辑几乎是正确的......)

    注意子分支的长度比分支的长度小一;所以left_oneright_one 应该是1 + MinBranch...

    使用一些示例树逐步完成算法将有助于发现像这样的错误...

    【讨论】:

      【解决方案3】:

      看起来您几乎拥有它,但请考虑以下示例:

            4
      
         3     5
      

      当您跟踪 MinBranch 时,您会在您的 MinBranch(l,r,4)电话:

      left_one = MinBranch(l, r, l(x))
               = MinBranch(l, r, l(4))
               = MinBranch(l, r, 3)
               = 0
      

      说的有道理,毕竟3是叶子节点,所以当然是距离 到最近的叶节点为 0。right_one 也是如此。

      但你会在这里结束:

      return {min (left_one),(right_one)}
           = {min (0), (0) }
           = 0
      

      但这显然是错误的,因为这个节点 (4) 不是叶节点。您的 代码忘记计算当前节点(哎呀!)。我相信你可以管理 解决这个问题。


      现在,实际上,你这样做的方式并不是最快的,但我不是 确定这是否与本练习相关。考虑这棵树:

               4
             3   5
           2
         1
      

      您的算法将递归地计算左分支,即使它 如果您首先计算正确的分支,可以假设性地纾困 并注意到 3 有一个左边,所以它明显比 5 长(这是一个 叶子)。但是,当然,首先计算正确的分支并不总是 工作!

      相反,使用更复杂的代码,并且可能需要更大的权衡 内存使用情况,您可以从左到右,从上到下检查节点(只需 就像英语阅读顺序一样),然后停在你找到的第一页。

      【讨论】:

      • 哦该死:|呃,所以如果我做 1+minbranch(l,r,l(x)) 它会成功吗?
      • @rachel:我想是这样,但你应该在一些树上试试看。毕竟,如果没有,你就会失去积分,而不是我:-D
      • 感谢 dero 多次编辑和帮助我 - 我不关心时间和记忆,因为它是一个纯粹的理论问题 :)
      【解决方案4】:

      您创建的内容可以被视为深度优先搜索。但是,鉴于您所追求的(最短的分支),这可能不是最有效的方法。考虑一下您的算法将如何在左侧(根节点的)非常重但右侧只有一个节点的树上执行。

      提示:考虑广度优先搜索方法。

      【讨论】:

      • 谢谢你会尝试用 bfs 的欢呼来想出一个更好的解决方案 :)
      • 如果您追求效率,那么 BFS 也好不到哪里去——您只是在用时间成本换取空间成本。 IDDFS 结合了两者的最佳属性,而且开销很小。
      【解决方案5】:

      你所拥有的看起来像是一种深度优先搜索算法,它必须在你想出解决方案之前搜索整个树。您需要的是 breadth first search 算法,它可以在找到解决方案后立即返回,而无需进行完整搜索

      【讨论】:

      • +1 这就是我的建议。使用队列(或堆栈)的广度优先搜索是找到最浅叶节点的正确方法(这是表达此问题的另一种方式)。
      • 虽然您的评论通常有助于解决问题,但我必须投反对票,因为它对 作业 问题没有多大帮助。特别是因为要求学生在特定参数上使用和定义 MinBranch,而我不知道如何明智地实现具有此类限制的 BFS 算法。如果我错了,请考虑我的投票标志被颠倒了。 :)
      猜你喜欢
      • 2010-11-16
      • 1970-01-01
      • 2016-10-07
      • 2015-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      相关资源
      最近更新 更多