代码1 报错
class Solution {
public TreeNode invertTree(TreeNode root) {
// TreeNode _root = root; // 这是在保证
// _root = preOrderTree(root);
// return root;
root = preOrderTree(root);
return root;
}
public TreeNode preOrderTree(TreeNode root) {
if(root == null) return root;
swapNode(root.left, root.right);
preOrderTree(root.left);
preOrderTree(root.right);
return root;
}
public void swapNode(TreeNode left, TreeNode right) {
TreeNode tmp = left;
left = right;
right = tmp;
}
}
是错的

代码2 报错
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null) return root;
swapNode(root.left, root.right);
invertTree(root.left);
invertTree(root.right);
return root;
}
public void swapNode(TreeNode left, TreeNode right) {
TreeNode tmp = left;
left = right;
right = tmp;
}
}
还是错的

代码3 正确。
代码3和代码1、2的区别在swap函数上。
想不通
在各大平台问了一下,终于明白了。
分析: 在 Java 中,参数是按值传递的,而不是按引用传递的。我的swapNode函数,只交换了临时变量的值(引用),返回后,原本的树中结点值不变。
在这个修改后的版本中,swapNode 函数只接受一个参数 root,并直接在这个节点上交换左右子树的值。这样就能正确地实现二叉树翻转的功能。
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null) return root;
swapNode(root);
invertTree(root.left);
invertTree(root.right);
return root;
}
public void swapNode(TreeNode root) {
TreeNode tmp = root.left;
root.left = root.right;
root.right = tmp;
}
}
这样是对的

文章讨论了在Java中翻转二叉树时,代码1和2由于参数传递问题导致错误,而代码3通过直接在节点上交换子树值解决了问题。关键在于理解Java中参数是按值传递而非引用传递。
668

被折叠的 条评论
为什么被折叠?



