【LeetCode】101. 对称二叉树

95 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

题目

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1

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

示例 2

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

提示

  • 树中节点数目在范围 [1, 1000] 内
  • -100 <= Node.val <= 100

进阶:你可以运用递归和迭代两种方法解决这个问题吗?

题解

思路

如图所示,root = [1,2,2,3,4,4,3],是一颗轴对称二叉树,因此我们返回true。判断一棵二叉树是否轴对称,其实就是判断这颗二叉树的左右两个子树是否互为镜像。

两个子树互为镜像当且仅当:

  • 两个子树的根节点值相等;
  • 第一棵子树的左子树和第二棵子树的右子树对称,且第一棵子树的右子树和第二棵子树的左子树对称;

具体实现过程如下:

  • 我们定义两个指针p和q ,让p和q指针一开始分别指向左子树和右子树。
  • 同步移动这两个指针来遍历这棵树,每次检查当前 p 和 q 节点的值是否相等,如果相等再判断左右子树是否对称。

判断两颗树对称的递归边界:

  • p和q节点都为空时,左右子树都为空,返回 true;
  • p和q节点只有一个为空时,左右子树不对称,返回 false;
  • p和q节点值不相等,左右子树不对称,返回 false;

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(!root) return true;
        return dfs(root->left, root->right);
    }

    bool dfs(TreeNode* p, TreeNode* q){
        if(!p && !q)
            return true;
        if(!p || !q)
            return false;
        if(p->val != q->val)
            return false;
        return dfs(p->left, q->right) && dfs(p->right, q->left);
    }
};

结语

业精于勤,荒于嬉;行成于思,毁于随。