劍指 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);
}