这题和借鉴了27题的思路,创建一个镜像二叉树然后一一比较。
问题在于,27题实现的代码更改的是原树,更改之后原树也变了。
这是关于指针的理解,在创建一个镜像二叉树时,必须确保是真的创建了而不是在原树上更改,因为还要用到原树。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
//[1,2,2,3,4,4,3]
//
class Solution {
TreeNode tmp=null;
public boolean isSymmetric(TreeNode root) {
TreeNode B=mirror(root);
return compare(root,B);
}
boolean compare(TreeNode A,TreeNode B){
if(A==null&&B==null)
return true;
else if(A!=null&&B!=null)
return (A.val==B.val)&&compare(A.left,B.left)&&compare(A.right,B.right);
else
return false;
}
TreeNode mirror(TreeNode A){//这里实现的很巧妙,借鉴了别人的做法,因为一直不知道怎么把一个引用类型的变量复制过来,java实现这样的复制好像很麻烦。
if(A==null) return null;
TreeNode newRoot=new TreeNode(A.val);
newRoot.left=mirror(A.right);
newRoot.right=mirror(A.left);
return newRoot;
}
}
体会一下创造镜像二叉树的做法。mirror函数作用是传入一个引用类型的变量,新创建一个与该变量的val相同的引用类型。不能像27题那样用tmp做中间变量实现左右孩子的转换。这种做法要记住,怎么把引用类型A中的引用类型(A的左右孩子)也一并“复制”到新节点newRoot中。
原文:https://www.cnblogs.com/wsshub/p/14545115.html