二叉树中最短的分支?

时间:2009-08-28 04:07:09

标签: algorithm binary-tree pseudocode

可以使用两个函数lr对二叉树进行编码 这样,对于node nl(n)会给左侧孩子nr(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)}
}

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

5 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

请注意,子分支的长度比分支的长度小1;因此left_oneright_one应为1 + MinBranch...

使用一些示例树来深入了解算法将有助于发现像这样的一个错误...

答案 2 :(得分:1)

看起来你几乎拥有它,但请考虑这个例子:

      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(这是一个 叶)。但是,当然,首先计算正确的分支并不总是如此 工作!

相反,代码更复杂,可能需要更大的权衡 内存使用情况,你可以从左到右,从上到下检查节点(只是 喜欢英语阅读顺序)并停在你找到的第一片叶子上。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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