可以使用两个函数l
和r
对二叉树进行编码
这样,对于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)}
}
显然这不是很好或不完美。如果,我会很高兴 人们可以帮助我完善和工作 - 任何帮助 将不胜感激。
答案 0 :(得分:3)
我怀疑有人会直接为你解决作业。一个线索:随着树变大,返回值肯定会越来越高,对吧?但是我没有在函数中看到除0以外的任何数字文字,也没有添加运算符。你将如何回报更大的数字?
同一问题的另一个角度:随时你写了一个递归函数,它有助于枚举“我应该停止自我调用的所有条件是什么?我在每种情况下返回什么?” / p>
答案 1 :(得分:2)
你是正确的方法,但你并不在那里;您的递归算法将始终返回0.(逻辑几乎是正确的,但是......)
请注意,子分支的长度比分支的长度小1;因此left_one
和right_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算法,它可以在找到解决方案时立即返回而不进行完整的搜索