无法理解为什么在尝试反转二叉树时必须创建新的临时 TreeNode
Trouble understanding why a new temporary TreeNode has to be created when trying to invert a binary tree
public class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null) return null;
TreeNode tmp = root.left;
root.left = invertTree(root.right);
root.right = invertTree(tmp);
return root;
}
}
我不明白为什么上述解决方案有效,但以下解决方案无效。
public class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null) return null;
root.left = invertTree(root.right);
root.right = invertTree(root.left);
return root;
}
}
有人可以详细说明为什么必须有一个临时的 TreeNode 才能使程序运行吗?
在第二次分配后,您将 root.right 分配给 root.left,但上一行将 root.left 设置为 root.right,因此您的 root.right 等于它自己。
首先,第一个片段不会创建新的 TreeNode
。它只是存储对根的原始左子节点的引用。
如果您不保留该引用(如第二个片段中所示),您将丢失对根的原始左子树的引用,因为您将反转的结果分配给 root.left右子树(在root.left = invertTree(root.right);
),所以invertTree(root.left)
不对根的原始左子树进行操作。
另一种看待它的方式 - 使用临时变量的原因与需要临时变量以交换两个变量的原因类似。
public class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null) return null;
TreeNode tmp = root.left;
root.left = invertTree(root.right);
root.right = invertTree(tmp);
return root;
}
}
我不明白为什么上述解决方案有效,但以下解决方案无效。
public class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null) return null;
root.left = invertTree(root.right);
root.right = invertTree(root.left);
return root;
}
}
有人可以详细说明为什么必须有一个临时的 TreeNode 才能使程序运行吗?
在第二次分配后,您将 root.right 分配给 root.left,但上一行将 root.left 设置为 root.right,因此您的 root.right 等于它自己。
首先,第一个片段不会创建新的 TreeNode
。它只是存储对根的原始左子节点的引用。
如果您不保留该引用(如第二个片段中所示),您将丢失对根的原始左子树的引用,因为您将反转的结果分配给 root.left右子树(在root.left = invertTree(root.right);
),所以invertTree(root.left)
不对根的原始左子树进行操作。
另一种看待它的方式 - 使用临时变量的原因与需要临时变量以交换两个变量的原因类似。