leetcode101_Symmetric Tree

LeetCode 101. Symmetric Tree (对称树)

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree [1,2,2,3,4,4,3] is symmetric:

    1
   / \
  2   2
 / \ / \
3  4 4  3

 

But the following [1,2,2,null,3,null,3] is not:

    1
   / \
  2   2
   \   \
   3    3

 

Note:
Bonus points if you could solve it both recursively and iteratively.

 


 

题目解析:这道题目给了我们一个二叉树,让我们判断这个二叉树是不是对称的。因为这里要比较两个点,所以需要另外一个function isSymmetric 来递归。所以我们来分析一下:代入的有2个点,那么有4种可能性

  1- 如果两个点都是null,那么它们是相等的。返回true (这也是一种base case 表示结束了,走到树的最低端了,需要返回)

  2- 如果一个点是null,另外一个不是null,那么它们不相等,返回false ( base case, 表示一边已经走到底了,需要返回)

  3- 如果两个点都不是null,但是它们的值不相等, 返回false (判断条件,不相等,就返回)

  4- 如果两个点相等,那么我们需要继续往下走,来判断接下去的点

class Solution {

//主程序:从root开始,对left和right初始递归
    public static boolean isSymmetric(TreeNode root) {
        if(root == null) {
            return true;//首先判断根节点,空二叉树肯定对称
        }
        return isSymmetric2(root.left, root.right);
    }

//递归体:对left和right进行判断,并且继续递归下面的四个节点,共两对:(left.left,right.right)和(left.right,right.left)

 public static boolean isSymmetric2(TreeNode root1, TreeNode root2) {
        if(root1 == null && root2 == null) {
            return true;
        }
        else if(root1 == null || root2 == null) {
            return false;
        }
        else {
            if(root1.val != root2.val) {
                return false;
            }
            else {
                return isSymmetric2(root1.left, root2.right) && isSymmetric2(root1.right, root2.left);//四种情况中,有两种返回false,有一种返回true,余下最后一种继续递归。注意:递归的方法是两个节点下方的四个节点对称代入递归体判断,只有到了递归的最后,两个节点都==null时才是true。
            }
        }
    }
}

上一篇:go defer、return的执行顺序


下一篇:[二叉树]leetcode101:对称二叉树(easy)