我想反映一棵二叉树,左边的所有节点都在右边,反之亦然。
类似的东西:
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;
}
有人可以向我解释原因吗?对我来说,它们看起来是相同的方法,除了一个使用临时树变量。
答案 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.
原来的左子树丢失了,取而代之的是右边的反射。
在第一个例程中,您将它们保存在局部变量中,直到您完成两个反射。