Leetcode 101. 对称二叉树

101. 对称二叉树

给你一个二叉树的根节点 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

思路1:

递归,因为是轴对称,肯定从左子树最左边,和右子树最右边来对称,所以对两个子树分别用后序遍历,
左子树左右中,右子树右左中
1.左右子树都空,对称
2.左空右不空,或者右空左不空,不对称
3.左右都不空,但是val不相等,不对称

代码

/**
 * 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 cmp(TreeNode* left, TreeNode* right) {
        if (left == NULL && right != NULL) return false;//左空右不空,不对称
        else if (left != NULL && right == NULL) return false; //右空左不空
        else if (left == NULL && right == NULL) return true;//都空,对称
        else if (left->val != right->val) return false;//不空但是值不相等

        bool outside = cmp(left->left, right->right);//左子树:左右中,右子树:右左中
        bool inside  = cmp(left->right, right->left);
        bool tt = outside & inside;	//中
        return tt;
    }
    bool isSymmetric(TreeNode* root) {
        if (root == NULL) return false;
        return cmp(root->left, root->right);
    }
};

思路2:

迭代的方法,用队列来写
左子树朝左走,右子树朝右走
1.左右子树都空,对称,跳过
2.左空右不空,或者右空左不空,不对称
3.左右都不空,但是val不相等,不对称

左子树的左子树和右子树的右子树,左子树的右子树和右子树的左子树两两比较

代码

/**
 * 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 == NULL) return true;
        queue<TreeNode*> que;
        que.push(root->left);
        que.push(root->right);

        while (!empty(que)) {
            TreeNode* l = que.front();//将左右结点取出判断
            que.pop();
            TreeNode* r = que.front();
            que.pop();

            if (!l && !r) {//左右都空,跳过
                continue;
            }

            if (!l || !r || l->val != r->val) {//左空右不空,右空左不空,都不空单不相等,都返回false
                return false;
            }
            que.push(l->left);
            que.push(r->right);
            que.push(l->right);
            que.push(r->left);
        }
        return true;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值