101 - Symmetric Tree

#easy

Given the root of a binary tree, check whether it is a mirror of itself (i.e., symmetric around its center).

Example 1:

Input: root = [1,2,2,3,4,4,3]
Output: true

Example 2:

Input: root = [1,2,2,null,3,null,3]
Output: false

Solution 1 - Queue

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if ( root -> left == NULL && root -> right == NULL ) return true;
        queue<TreeNode*> que;
        que.push(root -> left);
        que.push(root -> right);
        while ( !que.empty() ) {
            TreeNode * leftNode = que.front();
            que.pop();
            TreeNode * rightNode = que.front();
            que.pop();
            if ( leftNode == NULL && rightNode == NULL ) {
                continue; 
             //continue敘述可以馬上繼續下一次迴圈的執行,而不執行程式區塊未在continue敘述後的程式碼。
            }

            if ( ( leftNode == NULL || rightNode == NULL || ( leftNode -> val != rightNode -> val ))) {
                return false;
            }

            que.push( leftNode -> left );
            que.push( rightNode -> right );
            que.push( leftNode -> right );
            que.push( rightNode -> left );
        }

        return true;
    }
};

Solution 2 - Recursive

使用后序(收集孩子的訊息向上一層返回) 左右中

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool compare( TreeNode* left_node, TreeNode* right_node ) {
        if ( left_node == NULL && right_node != NULL ) return false;
        else if ( left_node != NULL && right_node == NULL ) return false;
        else if ( left_node == NULL && right_node == NULL ) return true;
        else if ( left_node -> val != right_node -> val ) return false;
        bool outside = compare( left_node -> left, right_node -> right ); // 左
        bool inside = compare( left_node -> right, right_node -> left ); // 右
        bool result = outside && inside; // 中