101. 对称二叉树
给你一个二叉树的根节点 root
, 检查它是否轴对称。
示例 1:
输入:root = [1,2,2,3,4,4,3] 输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3] 输出:false
分析:使用后序遍历递归的方式,确定递归终止的条件:
-
左子树节点为空,右子树节点不为空;
-
左子树节点不为空,右子树节点为空
-
左子树节点为空,右子树节点为空,返回true;
-
左子树节点值与右子树节点的子不相等;
下一层递归的条件:外层判断左节点的左孩子与右节点的右孩子是否先节点相等;内层左节点的右孩子和右节点的左孩子是否节点相等。如果都是true,则返回true。反之返回false。
class Solution {
/*******
*
*
* 使用后序遍历比较树是否是对称二叉树:
*
* 当需要使用节点的孩子信息时,就需要后序遍历;
* ****/
public boolean isSymmetric(TreeNode root){
if (root ==null) return true;
//使用递归的方法
return compareTreeNode(root.left,root.right);
}
public boolean compareTreeNode(TreeNode left, TreeNode right){
//递归终止的条件:
if (left == null && right !=null)return false;
else if(left !=null && right == null) return false;
else if(left == null && right ==null) return true;
else if(left.val != right.val) return false;//如果左右子节点不为空,并且值不相等的时候就返回false;
//下一层递归的开始:
boolean outside= compareTreeNode(left.left,right.right);//比较外侧;左节点的左孩子和右节点的右孩子;
boolean inside=compareTreeNode(left.right,right.left);//比较左节点的右孩子和右节点的左孩子;
boolean res = outside && inside;
return res;
}
}