判断二叉树是否对称(NC16/考察次数Top61/难度简单)

Posted 码农指南

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断二叉树是否对称(NC16/考察次数Top61/难度简单)相关的知识,希望对你有一定的参考价值。

描述:
给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)
注:如果是自身的镜像则可以沿着中轴线转动

示例1
输入:
{1,2,2}
返回值:
true
(题目来自牛客网)

用C++实现如下

class Solution {
public:
    /**
     *
     * @param root TreeNode类
     * @return bool布尔型
     */
    bool isSymmetric(TreeNode* root) {
//         //思路1,递归法,判断是否对称,直接判断每个左右节点是不是对称的即可,另外写一个递归函数isChildSymmetic()
//         if(!root)
//             return true;
//         return isChildSymmetic(root->left,root->right);
//     }
//     bool isChildSymmetic(TreeNode* left,TreeNode* right)
//     {
//         if(!left && !right)                                            //左右节点的指针都为空
//             return true;
//         if(left == nullptr ^ right == nullptr)                         //左右节点的指针是否为空结果不相同时
//             return false;
//         if(left->val != right->val)                                    //左右节点的值是否一样
//             return false;
//         return isChildSymmetic(left->left, right->right) &&            //判断左左与右右,以及左右与右左,是否都对称
//                isChildSymmetic(left->right, right->left);
//     }
         
        //思路2,迭代法,借助两个stack栈来实现
        //第一步,确定根部的情况
        if(!root)
            return true;
        if(!root->left && !root->right)                        //左右都为空
            return true;
        if(root->left == nullptr ^ root->right == nullptr)     //左右不一样则满足
            return false;
        queue<TreeNode*> s1,s2;                                //定义两个queue,用来存放节点,用于依次遍历
        s1.push(root->left);                                   //根部左节点push到s1中
        s2.push(root->right);                                  //根部右节点push到s2中
        while(!s1.empty() && !s2.empty())                      //(1)全部都不为空的时候
        {
            //先取值,弹,判断,压
            TreeNode* node1 = s1.front();                      //每次拿s1中首部元素
            TreeNode* node2 = s2.front();                      //每次拿s2中首部元素
            s1.pop();                                        
            s2.pop();                                        
            if(node1->val != node2->val)                           //节点的值不一样,则为false
                return false;
            if(node1->left == nullptr ^ node2->right == nullptr)   //1的左节点 与 2的右节点 指针是否为空不一致
                return false;
            if(node1->right == nullptr ^ node2->left == nullptr)   //1的右节点 与 2的左节点 指针是否为空不一致
                return false;
            if(node1->left)                                        //node1有左,右节点时,依次push进去
                s1.push(node1->left);
            if(node1->right)                      
                s1.push(node1->right);
            if(node2->right)                                       //node2有右,左节点时,依次push进去
                s2.push(node2->right);
            if(node2->left)
                s2.push(node2->left);
        }
        if(s1.empty() && s2.empty())                               //(2)全为空
            return true;
        return false;                                              //(3)其它
    }
};

纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!

以上是关于判断二叉树是否对称(NC16/考察次数Top61/难度简单)的主要内容,如果未能解决你的问题,请参考以下文章

二叉树中是否存在节点和为指定值的路径(NC9/考察次数Top63/难度简单)

二叉树中是否存在节点和为指定值的路径(NC9/考察次数Top63/难度简单)

平衡二叉树(NC62/考察次数Top45/难度简单)

牛客题霸 NC16 判断二叉树是否对称

NC16 判断二叉树是否对称

重建二叉树(NC12/考察次数Top31/难度中等)