Loading

力扣 - 剑指 Offer 28. 对称的二叉树

题目

剑指 Offer 28. 对称的二叉树

思路1

  • 看到这题首先想到可以将二叉树复制一份镜像的,然后进行后续遍历比较两棵树的每一个节点是否相等,但是这样未免太复杂了,因此我们可以用更好的方法来解决
  • 一般来说,二叉树的后续遍历是从左子树开始的,但是我们也可以调换一下位置,从右子树开始递归,这样子和左边开始是对称的方向
  • 同时,我们要如何判断是否是对称的呢?要求左边的和右边以根节点垂直方向为对称轴对称,那么整个二叉树就是对称的;那对于根节点的左子树和右子树来说要保证:左子树的左子树右子树的右子树左子树的右子树右子树的左子树这些对称即可,然后一直递归下去判断,直到判断完整个树,但是如果其中有一个是不对称的,那么就会返回false,即整个树是不对称的

代码

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if (root == null) {
            return true;
        }

        return help(root.left, root.right);
    }

    public boolean help(TreeNode node1, TreeNode node2) {
        // 只要其中一个为null,就需要判断是否都为null
        // 如果都为null,返回true,说明遍历到叶子节点了
        // 如果其中一个为不为null,返回false
        if (node1 == null || node2 == null) {
            return node1 == node2;
        }

        // 节点的值不相等也返回false
        if (node1.val != node2.val) {
            return false;
        }

        // 然后再进行递归两棵树的左右子树进行比较,只要有一个为false,就不是对称的
        return help(node1.left, node2.right) && help(node1.right, node2.left);
    }
}

复杂度分析

  • 时间复杂度:\(O(N)\)
  • 空间复杂度:\(O(N)\)
posted @ 2021-11-24 12:33  linzeliang  阅读(17)  评论(0编辑  收藏  举报