每日一题——[剑指 Offer 28. 对称的二叉树]

133 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目描述:

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

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

思路分析:

这题作为力扣的基础题,主要考查了二叉树查询和条件搜索的思想,这里我们主要使用深度优先遍历进行解决。

我们根据题目可以发现,要想判断一棵树是否为镜像对称树,只需要判断其是否满足以下几个条件:

  • 根节点的左子树和右子树的值相等
  • 当左子树为空的时候,右子树也应该为空

代码:

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
            if(root == NULL) return true;// 如果根节点为空,直接返回true
            return compare(root->left, root->right);
    }
    bool compare(TreeNode* left, TreeNode* right)
    {
        // 左子树和右子树同时为空,代表这段子树相等
        if(left == NULL && right == NULL) return true;
        // 如果左子或者右子有一个为空,或者两个节点的值不相等,返回false
        if(left == NULL || right == NULL || left->val != right->val  ) return false;
         //继续对比两个节点的左右子节点是否对应相等,左节点的左子节点 == 右节点的右子节点,且左节点的右子节点 == 右节点的左子节点
        return compare(left->left,right->right) && compare(left->right,right->left);
    }
};

注意:最后还需要判断左边的左边和右边的右边比较 && 左边的右边和右边的左边比较,如果相等,才能说明这个根节点的左右子节点相等;

总结:

对于树的遍历,我们可以先确定主要思路,再决定使用哪一种搜索模板,最后实现编码完成对题目的AC