226. 翻转二叉树
- 代码1 报错
- 代码2 报错
- 代码3 正确。
代码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;
}
}
这样是对的