1
/ \
2 2
/ \ / \
3 4 4 3
输入:root = [1,2,2,3,4,4,3]
输出:true
输入:root = [1,2,2,null,3,null,3]
输出:false
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
// 空树显然对称
if (root == null)
return true;
// 非空树,检查左右子树是否对称
return recursion(root.left, root.right);
}
// 检查L和R是否对称
public boolean recursion(TreeNode L, TreeNode R) {
// L和R同时越过叶子结点,为空,则该树从顶到底都对称,返回true
if (L == null && R == null)
return true;
// 1. L和R只有一个越过叶子结点
// 2. L的值和R的值不相等
// 这两种情况下明显树不对称,返回false
if ((L == null || R == null) || L.val != R.val)
return false;
// 判断L的left和R的right是否对称,L的right和R的left是否对称
return recursion(L.left, R.right) && recursion(L.right, R.left);
}
}
/**
* Example:
* var ti = TreeNode(5)
* var v = ti.`val`
* Definition for a binary tree node.
* class TreeNode(var `val`: Int) {
* var left: TreeNode? = null
* var right: TreeNode? = null
* }
*/
class Solution {
fun isSymmetric(root: TreeNode?): Boolean {
// 空树显然对称
// 非空树,检查左右子树是否对称
return if (root == null) true else recursion(root.left, root.right)
}
// 检查L和R是否对称
fun recursion(L: TreeNode?, R: TreeNode?): Boolean {
// L和R同时越过叶子结点,为空,则该树从顶到底都对称,返回true
if (L == null && R == null)
return true
// 1. L和R只有一个越过叶子结点
// 2. L的值和R的值不相等
// 这两种情况下明显树不对称,返回false
return if (L == null || R == null || L.`val` !== R!!.`val`) false else recursion(
L.left,
R.right
) && recursion(L.right, R.left)// 判断L的left和R的right是否对称,L的right和R的left是否对称
}
}