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;}
}
这样是对的