Symmetric Tree 对称树

判断一棵二叉树是否为对称的树。如

   1
   / 
  2   2
 /  / 
3  4 4  3

观察上面的树可以看出:左子树的右子树等于右子树的左子树,左子树的左子树等于右子树的右子树。

首先可以使用递归。递归容易理解

class Solution {
    public boolean isSymmetric(TreeNode root) {
       
        if(root==null) return true;
       
        return isSym(root.left,root.right);
        
  
    }
    public boolean isSym(TreeNode node1,TreeNode node2){
        if(node1==null&&node2==null) return true;
        if(node1==null||node2==null) return false;
        if(node1.val!=node2.val) return false;
        return isSym(node1.left,node2.right)&&isSym(node1.right,node2.left);
    }
}

 再是可以使用迭代,不用递归。

思路就是向遍历一样,每一层比较,但是不输出,只是在遍历过程中比较。使用广度优先遍历。因为要比较,所以一次取出两个节点,进行比较。然后存放时,因为需要比较的是a节点的左子树跟b节点的右子树,a节点的右子树和b节点的左子树。所以存放时也按照这种顺序存放进队列,方便取出两个时直接比较。见代码

 public boolean isSymmetric(TreeNode root) {
       
        if(root==null) return true;
  
        Queue<TreeNode> q=new LinkedList<>();
      //先存入两个节点,用于比较 q.add(root.left); q.add(root.right);
while(q.size()>0){ TreeNode left=q.poll(); TreeNode right=q.poll(); if(left==null&&right==null) continue;//由于可能存入的就是null,所以还得继续比较 if(left==null||right==null) return false; if(left.val!=right.val) return false;
      //这里存放顺序很重要,方便下次取出比较。 q.add(left.left); q.add(right.right); q.add(left.right); q.add(right.left); }
return true; }

原文地址:https://www.cnblogs.com/xiaolovewei/p/8074119.html