方法一:递归

一个对称的二叉树,两个不同方向的前序遍历一定是相同的。通过递归进行两个方向的遍历,终止条件为:当两个节点只有一个为空,或者两个节点的值不相同,则二叉树不对称。

时间复杂度:o(n)

空间复杂度:o(n)。递归栈的深度

class Solution {
  public:
    bool isSymmetrical(TreeNode* root1, TreeNode* root2) {
        //节点都为空时,返回true
        if (root1 == nullptr && root2 == nullptr)
            return true;

        if (root1 == nullptr || root2 == nullptr || root1->val != root2->val)
            return false;
        
        return (isSymmetrical(root1->left, root2->right) &&
                isSymmetrical(root1->right, root2->left));
    }
    bool isSymmetrical(TreeNode* pRoot) {
        return isSymmetrical(pRoot, pRoot);
    }
};

方法二:辅助队列

一个对称的二叉树,两个不同方向的层间遍历一定是相同的。

通过创建两个辅助队列,对二叉树进行不同方向的层间遍历,进行比较。

时间复杂度:o(n)

空间复杂度:o(n)。两个辅助队列

class Solution {
  public:
    bool isSymmetrical(TreeNode* pRoot) {
        //空树为对称的
        if (pRoot == NULL)
            return true;
        //辅助队列用于从两边层次遍历
        queue<TreeNode*> q1;
        queue<TreeNode*> q2;
        q1.push(pRoot->left);
        q2.push(pRoot->right);
        while (!q1.empty() && !q2.empty()) {
            //分别从左边和右边弹出节点
            TreeNode* left = q1.front();
            q1.pop();
            TreeNode* right = q2.front();
            q2.pop();
            //都为空暂时对称
            if (left == NULL && right == NULL)
                continue;
            //某一个为空或者数字不相等则不对称
            if (left == NULL || right == NULL || left->val != right->val)
                return false;
            //从左往右加入队列
            q1.push(left->left);
            q1.push(left->right);
            //从右往左加入队列
            q2.push(right->right);
            q2.push(right->left);
        }
        //都检验完都是对称的
        return true;
    }
};