LeetCode 劍指 Offer 28. 對稱的二叉樹

劍指 Offer 28. 對稱的二叉樹

請實現一個函數,用來判斷一棵二叉樹是不是對稱的。如果一棵二叉樹和它的鏡像一樣,那麼它是對稱的。

例如,二叉樹 [1,2,2,3,4,4,3] 是對稱的。

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

但是下面這個 [1,2,2,null,3,null,3] 則不是鏡像對稱的:

    1
   / \
  2   2
   \   \
   3    3

示例 1:

輸入:root = [1,2,2,3,4,4,3]
輸出:true

示例 2:

輸入:root = [1,2,2,null,3,null,3]
輸出:false

解題

package tree.二叉樹的鏡像;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

/**
 * @Auther: truedei
 * @Date: 2020 /20-6-10
 * @Description: 二叉樹鏡像
 */
public class Solution {

    static public boolean isSymmetric(TreeNode root) {

        //根節點爲null時,返回true,說明是
        return root == null?true:check(root.left,root.right);
    }

    private static boolean check(TreeNode left, TreeNode right) {
        if(left == null && right==null)
            return true;
        if(left==null || right==null || left.val != right.val)
            return false;

        return check(left.left,right.right) && check(left.right,right.left);
    }

    public static void main(String[] args) {
        TreeNode t1 = new TreeNode(1);
        TreeNode t2 = new TreeNode(2);
        TreeNode t3 = new TreeNode(2);
        TreeNode t4 = new TreeNode(3);
        TreeNode t5 = new TreeNode(4);
        TreeNode t6 = new TreeNode(4);
        TreeNode t7 = new TreeNode(3);


        t1.left=t2;
        t1.right=t3;

        t2.left=t4;
        t2.right=t5;

        t3.left=t6;
        t3.right=t7;

        boolean bool = isSymmetric(t1);
        System.out.println(bool);

    }
}

class TreeNode {
    int val;//每個節點存放的數據
    TreeNode left;//左節點
    TreeNode right;//右節點
    TreeNode(int x) { val = x; }
}

核心代碼:

static public boolean isSymmetric(TreeNode root) {
	//如果傳過來的是null,則返回true,否則就去檢查左右節點
    return root == null?true:check(root.left,root.right);
}

//負責遞歸檢查左右節點
private static boolean check(TreeNode left, TreeNode right) {
	//如果左右都爲null,說明該二叉樹也是對稱的
    if(left == null && right==null)
        return true;
    //如果缺少左右子節點的某一個,或者不相等,那就不是一顆對稱二叉樹
    if(left==null || right==null || left.val != right.val)
        return false;
	//否則就檢查,該二叉樹的左節點的左和右節點的右;和檢查另外兩個
	//如果都是true,說明對稱
    return check(left.left,right.right) && check(left.right,right.left);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章