【树】剑指 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

 

解答:

方法一:递归

对称二叉树定义: 对于树中 任意两个对称节点 LL 和 RR ,一定有:
L.val = R.valL.val=R.val :即此两对称节点值相等。
L.left.val = R.right.valL.left.val=R.right.val :即 LL 的 左子节点 和 RR 的 右子节点 对称;
L.right.val = R.left.valL.right.val=R.left.val :即 LL 的 右子节点 和 RR 的 左子节点 对称。

 

 

 

/**
 * 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 recur(root.left,root.right);
    }
/*
recur(L, R) :

终止条件:
当 树LL 和 RR 同时越过叶节点: 此从顶至底的节点都对称,因此返回 true ;
当 LL 或 RR 中只有一个越过叶节点: 此树不对称,因此返回 false ;
当节点 LL 值 != 节点 RR 值: 此树不对称,因此返回 false ;

递推工作:
判断两节点 L.leftL.left 和 R.rightR.right 是否对称,即 recur(L.left, R.right) ;
判断两节点 L.rightL.right 和 R.leftR.left 是否对称,即 recur(L.right, R.left) ;
返回值: 两对节点都对称时,才是对称树,因此用与逻辑符 && 连接。

*/
    public boolean recur(TreeNode L,TreeNode R){
        if(L == null && R == null) return true;
        if(L == null || R == null || L.val!=R.val) return false;

        return recur(L.left,R.right) && recur(L.right,R.left);
    }
}

 

posted @ 2020-08-26 21:51  3KBLACK  阅读(59)  评论(0)    收藏  举报