解题思路

  • 本题判断二叉树是否对称,要通过对二叉树的层序遍历来实现,即通过层序遍历来判断当前状态是否满足对称,并进入下一层判断,是较为典型的BFS。
  • 根据题目备注所提示的,这里给出递归以及迭代两种解法。
  • 题目相对要注意的地方在于,是在于对节点的访问顺序,即如何满足对称的条件,示意图如下:

图片说明

方法一:递归

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @return bool布尔型
     */
    bool isSymmetric(TreeNode* root) {
        // write code here
        if(root==nullptr)
            return true;
        return help(root->left,root->right);
    }

    //辅助递归函数,参数为两节点,判断两节点是否当前值相等且子节点满足对称。
    bool help(TreeNode* left,TreeNode* right){
        //判断left和right有可能为空指针的情况
        if(!left&&!right)
            return true;
        //其中有一个节点不存在,或者两节点值不等,则返回false
        if((!left||!right)||(left->val!=right->val))
            return false;
        //递归调用判断
        return help(left->left,right->right)&&help(left->right,right->left);        
    }
};

复杂度分析:

时间复杂度:O(n),n为节点数量,每个节点访问一次。
空间复杂度:O(n),来源于递归使用的栈空间,递归次数是n的级别。

方法二:迭代

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @return bool布尔型
     */
    bool isSymmetric(TreeNode* root) {
        // write code here
        if(root==nullptr)
            return true;
        //队列q按序存储每次需要判断的两节点。left,right相邻
        queue<TreeNode*> q;
        q.push(root->left);
        q.push(root->right);
        while(!q.empty()){
            TreeNode* l=q.front();
            q.pop();
            TreeNode* r=q.front();
            q.pop();
            //与方法一中的判断方式相同
            if(!l&&!r)
                continue;
            if((!l||!r)||(l->val!=r->val))
                return false;
            //按照满足对称要求的方式进行两两组合,保证下次pop出来的l,r是需要判断的一对节点。
            q.push(l->left);
            q.push(r->right);

            q.push(l->right);
            q.push(r->left);
        }
        return true;
    }
};

复杂度分析:

时间复杂度:O(n),同上。
空间复杂度:O(n),来源于队列中的节点数量,不超过n。