从零学算法

101.给你一个二叉树的根节点 root , 检查它是否轴对称。(就是以根节点为对称轴,左右是否成镜像)
示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true

  • 我的原始人解法,层序遍历我就不多说了,等于判断数组是否对称,唯一难点就是需要镜像入队,我就直接用别人的了,递归我想不到

  •   public boolean isSymmetric(TreeNode root) {
          //队列
          Queue<TreeNode> queue = new LinkedList<>();
          if (root == null)
              return true;
          //左子节点和右子节点同时入队
          queue.add(root.left);
          queue.add(root.right);
          //如果队列不为空就继续循环
          while (!queue.isEmpty()) {
              //每两个出队
              TreeNode left = queue.poll(), right = queue.poll();
              //如果都为空继续循环
              if (left == null && right == null)
                  continue;
              //如果一个为空一个不为空,说明不是对称的,直接返回false
              if (left == null ^ right == null)
                  return false;
              //如果这两个值不相同,也不是对称的,直接返回false
              if (left.val != right.val)
                  return false;
              //这里要记住入队的顺序,他会每两个两个的出队。
              //左子节点的左子节点和右子节点的右子节点同时
              //入队,因为他俩会同时比较。
              //左子节点的右子节点和右子节点的左子节点同时入队,
              //因为他俩会同时比较
              queue.add(left.left);
              queue.add(right.right);
              queue.add(left.right);
              queue.add(right.left);
          }
          return true;
      }
    
    
  • 他人解法:其实难点就在于怎样定义对称能够得到递归的最小单元。根据对称这个词,应该能够想到应该传左右节点两个参数,当左右节点的值相等,且左节点的左节点等于右节点的右节点并且左节点的右节点等于右节点的左节点则此时对称。代入下面的第二层为左右节点来看。

    			1		
              /   \
             2     2
     	   /  \   /  \
     	  3    4 4    3     
    
  •   public boolean isSymmetric(TreeNode root) {
          return solve(root.left,root.right);
      }
      public boolean solve(TreeNode left, TreeNode right){
          if(left == null && right == null){
              return true;
          }
          if(left==null || right==null || left.val != right.val){
              return false;
          }
          return solve(left.left,right.right) && solve(left.right,right.left);
      }
    

你可能感兴趣的:(算法学习,算法,java,开发语言)