题解 | #对称的二叉树#

对称的二叉树

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);
    }


全部评论

相关推荐

dongsheng66:如果想进大厂的话,在校经历没必要占这么大篇幅,可以把专业技能单独放一个专栏写,可以加个项目经历
点赞 评论 收藏
分享
小谷围鸡肉卷阿姨:+1,腾子投完一动不动
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务