我发现了这个问题,我不确定我的方法是否正确:
“二进制树可以使用编码 两个函数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是函数,为什么在调用函数时它们作为普通参数传递?
提前感谢您的回答!
答案 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))
至于传递l
和r
作为参数,一切都取决于:某些语言(例如,函数式语言)允许您将函数作为参数传递。其他人(例如,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 [...]编码时选择的符号”