两种递归方法的区别

时间:2016-03-02 02:04:45

标签: recursion binary-tree

我想反映一棵二叉树,左边的所有节点都在右边,反之亦然。

类似的东西:

         A
      /    \
    B       C
  /       /   \
D       E      F

会变成

         A
      /    \
    C       B
  /  \        \
F      E       D

我注意到,在编写我的解决方案时,此代码有效:

static Tree getReflection(Tree root) {
   if(root == null) {
      return null;
   }
   Tree reflect = root;
   Tree subRight = getReflection(root.right);
   Tree subLeft = getReflection(root.left);
   reflect.left = subRight;
   reflect.right = subLeft;
   return reflect;
}

然而,这个没有:

static Tree getReflection(Tree root) {
   if(root == null) {
      return null;
   }
   Tree reflect = root;
   reflect.left = getReflection(root.right);
   reflect.right = getReflection(root.left);
   return reflect;
}

有人可以向我解释原因吗?对我来说,它们看起来是相同的方法,除了一个使用临时树变量。

2 个答案:

答案 0 :(得分:0)

这是因为在第二个函数(不起作用的函数)中,您将反射结果分配给左侧节点,然后将其用作您分配给右侧节点的反射的输入。 / p>

树反射= ;

reflect.left = getReflection(root.right);

reflect.right = getReflection( root.left );

答案 1 :(得分:0)

查看每个中的第一个陈述:何时分配

  

reflect = root

,这两个变量现在指向相同的内存位置。现在,让我们看一下第二个例程的操作:

Tree reflect = root;
// reflect and root now refer to exactly the same tree.
reflect.left = getReflection(root.right);
// reflect the right subtree; make that the new left subtree.
reflect.right = getReflection(root.left);
// Grab that new subtree, re-reflect it, and put it back on the right.

原来的左子树丢失了,取而代之的是右边的反射。

在第一个例程中,您将它们保存在局部变量中,直到您完成两个反射。