题目:对称二叉树

要判断一个二叉树是否对称,就是判断这个树根节点的左右子树是否能够翻转,而判断能否翻转,则需要判断这棵二叉树的内外侧节点是否相同

因为需要拿到左右子树各自的信息,所以使用后序遍历

首先对特殊情况进行判断:

1.传入的左节点不为空,右节点为空,那么无法翻转

2.左空右不空同理

3.两边都为空时,可以翻转

4.两遍都不为空,但是值不同,不能翻转

5.只有当两者都不为空且值相等时,才进入递归逻辑,判断左子树的左节点与右子树的右节点能否翻转(外侧),以及左子树的右节点与右子树的左节点能否翻转(内侧)

最后,只有当左右节点都能反转时,才可以认为这棵树 / 子树能翻转

 1bool Compare(TreeNode* left, TreeNode* right)
 2    {
 3        if(!left && right) return false;
 4        else if(left && !right) return false;
 5        else if(!left && !right) return true;
 6        else if(left->val != right->val) return false;
 7        else
 8        {
 9            bool outside = Compare(left->left, right->right);
10            bool inside = Compare(left->right, right->left);
11            return outside && inside;
12        }
13    }
14    bool isSymmetric(TreeNode* root)
15    {
16        return Compare(root->left, root->right);
17    }