题解 | #对称的二叉树#

对称的二叉树

https://www.nowcoder.com/practice/ff05d44dfdb04e1d83bdbdab320efbcb

两种思路,层序遍历判断对称,或是直接在递归中判断。
    //思路,可以用层序遍历,每一层的结果在数组中一定是镜像的。
    //判断时直接在数组中预判下一层即可。
    bool isSymmetrical_v1(TreeNode* pRoot) {
        if(pRoot==NULL)
            return true;
        queue<TreeNode*>q;
        vector<TreeNode*>children;
        int parent=1;
        int childNum=0;
        q.push(pRoot);
        while(!q.empty())
        {
            TreeNode* Current=q.front();
            q.pop();
            parent--;
            
            children.push_back(Current->left? Current->left:NULL);
            children.push_back(Current->right? Current->right:NULL);
            
            childNum+=2;
            //本层的节点都出队了,即下一层的节点都进入数组了
            if(parent==0)
            {
                for(int i=0;i<childNum/2;i++)
                {
                    //如果都不为空
                    if( children[i] && children[childNum-i-1] )
                    {
                        if(children[i]->val!=children[childNum-i-1]->val){
                            return false;
                        }
                        //如果都为空
                    }
                    else if((!children[i]) && (!children[childNum-i-1]))
                    {
                        continue;
                    }
                    else//如果一边为空一边不为空。
                    {
                        return false;
                    }
                }
                for(auto child:children)
                {
                    if(child==NULL){
                        childNum--;
                        continue;
                    }
                    q.push(child);
                }
                //对状态重新初始化。
                children.clear();
                parent=childNum;
                childNum=0;
            }
        }
        return true;
    }
    //从排行榜抄来的递归思路。
    bool isSymmetrical(TreeNode* pRoot) {
    //思路:辅助递归函数比较两节点是否符合,符合就递归往下
        if(!pRoot) return true;
        return helper(pRoot->left,pRoot->right);
    }
    bool helper(TreeNode* left,TreeNode* right){
        //如果目标的两个节点都不存在,那肯定是对称的
        if(!left && !right) return true;
        //如果目标的两个节点只有其中一个存在,或是即使是存在了但值不相等,则不对称
        if((!left || !right || left->val != right->val)) return false;
        //让左节点的左节点与右节点的右节点比较,让左节点的右节点与右节点的左节点比较
        //这样才能也满足镜像。
        return helper(left->left,right->right) && helper(left->right,right->left);
    }


全部评论

相关推荐

尊尼获获:闺蜜在哪?
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
09-30 19:49
起名星人:蛮离谱的,直接要求转投销售
投递汇川技术等公司10个岗位
点赞 评论 收藏
分享
最近和朋友聊天,她说了句让我震惊的话:"我发现我连周末点外卖都开始'最优解'了,一定要赶在高峰期前下单,不然就觉得自己亏了。"这不就是典型的"班味入侵"吗?工作思维已经渗透到生活的方方面面。
小型域名服务器:啊?我一直都这样啊?我还以为是我爱贪小便宜呢?每次去实验室都得接一杯免费的开水回去,出门都得规划一下最短路径,在宿舍就吃南边的食堂,在实验室就吃北边的食堂,快递只有顺路的时候才取。
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务