根据题意,本题要判断一下二叉树是不是对称二叉树,即二叉树按照中线翻转,它的左子树和右子树是不是一样。
那么,我们根据题意可知,这个题就是需要我们判断,二叉树翻转之后的结果。但是我们在翻转的时候可以采用前序或者后序,这里我们只能采用后序,因为,我们需要层层处理左右节点,并且把左右节点是否对称的结果返回给上一个节点,即中间节点才可以判断。
那么,我们采用递归来做,首先确定递归的传入参数以及返回的参数。我们需要返回一个布尔值,需要传入左节点和右节点;
继续决定递归的截至条件。当左节点为空,右节点不为空,则不对称;当左节点不为空,右节点为空,则不对称;当左节点为空且右节点为空时,对称,继续比较下一层;当左节点的值和右节点的值不相等,则不对称。
那么我们单层递归的逻辑,就是需要先比较外侧树,即左子树的左子树和右子树的右子树是不是对称;再比较内侧树,即左子树的右子树和右子树的左子树是不是对称。
当二者的值都是true的时候,则返回true。
class Solution {
public boolean isSymmetric(TreeNode root) {
boolean result = compare(root.left,root.right);
return result;
}
private boolean compare(TreeNode left,TreeNode right){
if(left != null && right == null) return false;
if(left == null && right != null) return false;
if(left == null && right == null) return true;
if(left.val != right.val) return false;
boolean outside = compare(left.left,right.right);\\比较外侧树
boolean inside = compare(left.right,right.left);\\比较内侧树
boolean result = outside&&inside;
return result;
}
}