题目:对称二叉树
要判断一个二叉树是否对称,就是判断这个树根节点的左右子树是否能够翻转,而判断能否翻转,则需要判断这棵二叉树的内外侧节点是否相同
因为需要拿到左右子树各自的信息,所以使用后序遍历
首先对特殊情况进行判断:
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 }