剑指 Offer 28(树4).对称的二叉树

剑指 Offer 28(树4).对称的二叉树

问题描述:

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

例如,二叉树 [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

示例

输入:root = [1,2,2,3,4,4,3]
输出:true
输入:root = [1,2,2,null,3,null,3]
输出:false

解题思路:思路链接

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

根据以上规律,考虑从顶至底递归,判断每对节点是否对称,从而判断树是否为对称二叉树。

image-20210909101258630

使用递归代码实现:

/**
 * 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) {
    
    
        //当根节点为空时,毫无疑问左右子节点都为null,是对称的
        if(root == null){
    
    
            return true;
        }
        //建立一个队列,将根节点root放入队列中,并取出根节点,获取根节点的左右子节点
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        TreeNode node = queue.poll();
        //递归调用判断左右结点的值是否满足对称
        return recursion(node.left,node.right);
    }

    private static boolean recursion(TreeNode l ,TreeNode r){
    
    
        //当左右结点的值都为空时,代表同时比较完成,满足对称
        if(l == null && r == null){
    
    
            return true;
        }
        //判断左右子节点,有一方先判定结束,或者左右子节点的值不同,不满足对称
        if(l == null || r == null || l.val != r.val){
    
    
            return false;
        }
        //经过以上条件,代表此时左右子节点对应的值相同,递归调用下一个左右子节点的值是否满足对称
        boolean t = recursion(l.left,r.right) && recursion(l.right,r.left);
        return t;
    }
}

猜你喜欢

转载自blog.csdn.net/Royalic/article/details/120195798
今日推荐