给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1
/ \
2 2
\ \
3 3
说明:
如果你可以运用递归和迭代两种方法解决这个问题,会很加分。
官方题解,递归这类题目,看懂容易,设计不容易
#include <iostream>
#include <stdio.h>
using namespace std;
// 1
// / \
// 2 2
// / \ / \
// 3 4 4 3
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
bool isSymmetric(TreeNode* root) {
return isMirror(root,root);
}
bool isMirror(TreeNode* t1, TreeNode* t2){
if(t1==NULL && t2==NULL)
return true;
if(t1==NULL || t2==NULL)
return false;
printf("t1:%d----t2:%d\n",t1->val,t2->val);
if(t1->val == t2->val &&
isMirror(t1->left,t2->right) &&
isMirror(t1->right,t2->left)){
return true;
}else{
return false;
}
}
};
int main(){
TreeNode *root = new TreeNode(1);
TreeNode *l1 = new TreeNode(2);
TreeNode *r1 = new TreeNode(2);
TreeNode *ll2 = new TreeNode(3);
TreeNode *lr2 = new TreeNode(4);
TreeNode *rl2 = new TreeNode(4);
TreeNode *rr2 = new TreeNode(3);
root->left = l1;
root->right = r1;
l1->left = ll2;
l1->right = lr2;
r1->left = rl2;
r1->right = rr2;
Solution *ps = new Solution();
bool res = ps->isSymmetric(root);
printf("res = %d\n",res);
return 0;
}