0

我正在研究一种递归方法...

public BinaryTree<T> TreeMirror ( BinaryTree<T> tree ) {
   BinaryTree mirror = new BinaryTree();
   mirror = clone(tree);
   ...
   TreeMirror(...)
   ...
} 

我不希望该方法在每个递归步骤中mirror引用不同的对象,也不希望在第一次迭代后重复该语句。我想知道是否可以进行 if 语句检查以查看 的实例是否已被初始化——在这种情况下将跳过and语句。BinaryTreemirror = clone(tree)mirrormirror = new BinaryTree()mirror = clone(tree)

如果不将mirror参数作为参数传递给方法或在类定义中定义它,我认为这是不可能的……但我想确定一下。

非常感谢任何建议。

- - - - -编辑 - - - - - -

我不允许更改方法签名,因此我无法在我的实现中传递对象。我可以创建镜像树,但只能通过将原始树修改为镜像,这是我想尽量避免的。我试图创建一个新BinaryTree对象,它是传入的原始树的镜像,但实际上无法弄清楚如何递归地执行它。

4

4 回答 4

2

很少看到像这样的公共递归函数。更好的解决方案可能是使用创建对象的公共方法,然后调用一个私有函数,该函数是递归的,只进行必要的更改。

通常很难让递归函数签名与您想向客户展示的内容相匹配。

于 2009-04-02T01:51:03.880 回答
1

镜像变量是方法的本地变量,并且总是在每次调用中都被初始化。

将 mirror 作为参数传递给该方法是一个非常好的选择。

编辑:如果你不能修改方法签名,你可以创建一个私有方法并调用它来执行递归吗?

于 2009-04-02T01:49:33.057 回答
0

Uri 的答案是最好的......将其重构为私有方法并简单地初始化镜像,然后调用私有(recrsive)方法将镜像作为参数传递。

于 2009-04-02T04:16:29.677 回答
0

“如果不将镜像作为参数传递给方法或在类定义中定义它,我认为这是不可能的……但我想确定一下。”

正确,这将是做你想做的事情的一种方法,因为镜像不是递归不变量。

另一种方法是您的递归算法仅克隆节点,而不是整个子树。

于 2009-04-02T01:50:38.140 回答