Skip to content

LeetCode-面试题28-对称的二叉树

题目

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

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

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

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

java
    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

限制:

0 <= 节点个数 <= 1000

解题思路

方法1:栈

利用栈一次性拿出2个节点进行比较

将左子树的left节点和右子树的right节点放入栈

之后将左子树的right节点和右子树的left节点放入栈,比较2个值是否相等

方法2:递归

终止条件:

  • 与栈的条件类似,当L和R同时越过叶子节点(即左右子节点为null),则这个树从顶到底都是对称的,返回True
  • 当L和R只有一个越过叶子节点(即左/右子节点有一个为null),则这个树不是对称的,返回False
  • 当L和R的值不相等时,则这个树不是对称的,返回False

开启递归:

  • 判断两个节点L.left和R.right是否是对称的
  • 判断两个节点L.right和R.left是否是对称的

方法3:队列

先入队列根节点的左右节点,按层遍历,queue入队顺序和判断逻辑相同,判断左子树的左节点和右子树的右节点是否相等,左子树的右节点和右子树的左节点是否相等。当左右同时为空时,跳过。当左右只有一个为空时,此时二叉树不可能对称,返回false

Java代码1

java
/**
 * 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||root.left==null&&root.right==null)
            return true;
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root.left);
        stack.push(root.right);
        while(!stack.isEmpty()){
            TreeNode rightnode = stack.pop();
            TreeNode leftnode = stack.pop();
            // 如果两个节点都为空就跳过,说明拿出来的左右节点至少是相等的
            // 如果两个节点有一个为空,则说明不是对称的,返回false
            if(leftnode==null&&rightnode==null)
                continue;
            if(leftnode==null||rightnode==null)
                return false;
            if(leftnode.val!=rightnode.val)
                return false;
            stack.push(leftnode.left);
            stack.push(rightnode.right);
            stack.push(leftnode.right);
            stack.push(rightnode.left);
        }
        return true;
    }
}

Python代码

python
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        def helper(L,R):
            if not L and not R: return True
            if not L or not R: return False
            if L.val != R.val: return False
            return helper(L.left,R.right) and helper(L.right,R.left)
        return helper(root.left,root.right) if root else True

Java代码2

java
/**
 * 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;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root.left);
        queue.offer(root.right);
        while(!queue.isEmpty()){
            int size = queue.size();
            for(int i=0;i<size;i++){
                TreeNode leftNode = queue.poll();
                TreeNode rightNode = queue.poll();
                if(leftNode==null&&rightNode==null){
                    continue;
                }
                if(leftNode==null||rightNode==null){
                    return false;
                }
                if(leftNode.val!=rightNode.val){
                    return false;
                }
                queue.offer(leftNode.left);
                queue.offer(rightNode.right);
                queue.offer(leftNode.right);
                queue.offer(rightNode.left);
            }
        }
        return true;
    }
}