题目详情
解题想法
我的第一个思路是对左右子树分别进行中序遍历,然后将右子树或左子树的遍历结果reverse,判断两个结果是否相等,相等的话就是对称。但这个方法会有个别案例无法通过,跟保存结果的方式有关。例如如果左右子树的元素都是2,即使他们不对称,reverse之后还是会相等。这种案例可以通过将某个节点如果有一个null子节点,则将null元素添加到中序遍历结果中来解决。(有两个null节点子节点直接return,不能把两个null都添加进来,否则还会输出true).还有另一个无法通过的案例是根节点的左右子节点存才但val不相等,直接将这种特殊情况单独考虑了。
第二个思路就是递归了,递归函数的作用来判断左右子树是否镜像。
解题思路
1. 对左右子树进行中序遍历
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root.left!=null && root.right!=null){
if(root.left.val!=root.right.val) return false;
}
List<Object> leftList=inOrderTravel(root.left);
List<Object> rightList=inOrderTravel(root.right);
Collections.reverse(rightList);
if(leftList.equals(rightList)) return true;
else return false;
}
public List<Object> inOrderTravel(TreeNode root){
List<Object> list=new ArrayList<>();
if(root==null){
list.add(null);
return list;
}
if(root.left==null && root.right==null){
list.add(root.val);
return list;
}
list.addAll(inOrderTravel(root.left));
list.add(root.val);
list.addAll(inOrderTravel(root.right));
return list;
}
}
2. 递归判断左右子树是否镜像
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null)
return true;
return isSymmetricSame(root.left, root.right);
}
public boolean isSymmetricSame(TreeNode left, TreeNode right) {
if (left == null && right == null)
return true;
if (left != null && right != null)
return left.val == right.val && isSymmetricSame(left.left, right.right) && isSymmetricSame(left.right, right.left);
return false;
}
}