二叉树递归问题

时间:2011-03-28 17:37:48

标签: algorithm recursion binary-tree pseudocode

我发现了这个问题,我不确定我的方法是否正确:

  

“二进制树可以使用编码   两个函数l和r,使得a   节点n,l(n)给出左边的子节点   n(如果没有则为零)和r(n)   给予合适的孩子(如果有,则为零)   是没有)。让测试(l,r,x)变得简单   用于获取的递归算法   由l和r编码的二叉树   与根节点一起运行   x表示二叉树,并返回   如果树中没有节点,则为“是”   一个孩子。给出伪代码   对于这个算法。“

我试过了:

test(l,r,x)
  if((l(x)!=null && r(x)!=null) || (l(x)==null && r(x)==null)) 
     return "yes"
   else return "no"

  if(test(l,r,l(x))=="yes") test (l,r,l(x)) else return "no"
  if(test(l,r,r(x))=="yes") test (l,r,r(x)) else return "no"

 return "yes"

这是对的吗?如果l和r是函数,为什么在调用函数时它们作为普通参数传递?

提前感谢您的回答!

3 个答案:

答案 0 :(得分:3)

您有三个基本条件:两个子项都为null,一个子项为null,或者两个子项都不为null。我也按照这个顺序测试它们(因为它简化了逻辑):

if l(x) == null && r(x) == null
    return true;
if l(x) == null || r(x) == null  // only need inclusive OR, due to previous test.
    return false;
return test(l, r, l(x)) && test(l, r, r(x))

至于传递lr作为参数,一切都取决于:某些语言(例如,函数式语言)允许您将函数作为参数传递。其他人(例如,C,C ++等)让你传递指向函数的指针 - 但它几乎无关紧要。有些人不会让你传递像函数一样的东西,在这种情况下你必须将它硬连接。在这种情况下,你通过传递l和{{无论如何,1}}作为参数。将函数作为参数传递主要是在/如果接收函数不知道它将接收先验函数(它在此处执行)时。

答案 1 :(得分:1)

你做的第一件事就是返回yes或no,所以最后一部分是无法访问的。

如果您有一个孩子,我会更改它,否则您将返回否,否则您将返回是或否,具体取决于您的孩子是否符合标准。

test(l,r,x)
  if((l(x)!=null && r(x)==null) || (l(x)==null && r(x)!=null)) 
     return "no"
  if(l(x) == null && r(x) == null) 
    return "yes"
  return test(l,r,l(x)) && test(l,r,r(x))

答案 2 :(得分:1)

我不认为这是正确的。我看到的问题是第一步:

if((l(x)!=null && r(x)!=null) || (l(x)==null && r(x)==null)) 
    return "yes"
else return "no"

问题在于,您无法在第一步确定整个树的“是”。你要做的就是把它分解成组件:

if this node has both children
    return the result of test(l,r,l(x)) && (test(l,r,r(x))
if this node has no children
    return true
if this node has 1 child
    return false

根据你的上一个问题(“如果l和r是函数,为什么它们在调用函数时作为正常参数传递?”),答案是它们不 到作为参数传递。这只是他们在说“二元树可以使用两个函数l和r [...]编码时选择的符号”