101. Symmetric Tree

1. 题目

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For Example:

This binary tree [1,2,2,3,4,4,3] is symmetric:

    1
   / \
  2   2
 / \ / \
3  4 4  3

But the following [1,2,2,null,3,null,3] is not:

    1
   / \
  2   2
   \   \
   3    3

Follow up: Solve it both recursively and iteratively.

2. 题解

  • 解题思路1:①使用二叉树中序遍历,如果遍历结果左右对称则说明此树为二叉树。

需要注意的是,这个前提并不正确,我们知道仅根据中序二叉树无法还原一颗二叉树,因此不能使用这个方法。如下面这两棵树:

*           1                        1
*         /   \                   /    \
*       2       2                3      2
*     /   \   /   \                \   / \
*    3    4   4   3                 4 4   3
*                                  /
*                                 2 

中序遍历结果是一样的==(3-2-4-1-4-2-3)==,但第二颗明显不是对称二叉树。

  • 解题思路2: 同时遍历左右子树,然后判断左右子树的节点值是否相同。

    代码实现如下:

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     struct TreeNode *left;
     *     struct TreeNode *right;
     * };
     */
    /*
    * 中序遍历的结果左右对称便可以表明为对称二叉树???
    *答案是否定的,例子如下:
    *
    *           1                        1
    *         /   \                   /    \
    *       2       2                3      2
    *     /   \   /   \                \   / \
    *    3    4   4   3                 4 4   3
    *                                  /
    *                                 2 
    *  仅仅通过中序遍历无法复原一颗二叉树
    */
    bool isSymmetricLeftRight(struct TreeNode* left, struct TreeNode *right){
        if(left == right){/*both NULL*/
            return 1;
        }else if(NULL == left || NULL == right){
            return 0;
        }else if(left->val != right->val){
            return 0;
        }
        return isSymmetricLeftRight(left->left, right->right) && isSymmetricLeftRight(left->right, right->left);
    }
    
    bool isSymmetric(struct TreeNode* root){
        if(NULL == root){/*如果root为空,是否应该为对称树,最好有个统一的规定*/
            return 1;
        }
        return isSymmetricLeftRight(root->left, root->right);
    }
    

结果如下:
101. Symmetric Tree_C