面试题 28:对称的二叉树

邮差的信 提交于 2020-03-15 23:47:09

题目描述

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

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

限制:

0 <= 节点个数 <= 1000

https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof/submissions/

思路

在前序遍历中,是先遍历左子树再遍历右子树的。

可以定义一种与前序遍历对称的遍历,先遍历右子树,再遍历左子树。

这样会发现,只要这两种遍历的结果是一样的,那就是对称的二叉树。

有个例外,对于每个节点的值相同的二叉树,遍历后的结果都是一个树,但不一定是对称的。这时需要将 null 判断也放进来。

        7
      /  \
     7    7
    / \  /
   7  7 7

如上面的二叉树,两种遍历结果都是 {7, 7, 7, 7, 7, 7},但不是对称的,这时将 null 判断加进来的不一样了。

前序遍历序列为 {7, 7, 7, null, null, 7, null, null, 7, 7, null, null, null}

对称遍历序列为 {7, 7, null, 7, null, null, 7, 7, null, null, 7, null, null}

代码

class Solution {
    public boolean isSymmetric(TreeNode root) {
        return isSymmetric(root, root);
    }

    private boolean isSymmetric(TreeNode root1, TreeNode root2) {
        // 节点都为 null,说明值相同,则返回 true
        if (root1 == null && root2 == null) {
            return true;
        }

        // 其中一个节点为空,说明值不相同,则返回 false
        if (root1 == null || root2 == null) {
            return false;
        }

        // 比较两个节点的值,若不相同,则返回 false
        if (root1.val != root2.val) {
            return false;
        }

        // 比较二叉树的左右子树是否对称
        // && 前面的比较左子树的左子节点与右子树的右子节点
        // && 后面的比较左子树的右子节点与右子树的左子节点
        return isSymmetric(root1.left, root2.right) && isSymmetric(root1.right, root2.left);
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!