给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
分析:
本题要判断一棵树是否镜面对称,即判断它的左右两棵子树是否是对称的。子树的判断方法是怎样的呢?首先两棵子树的根节点要相同,然后左子树的左子树要和右子树的右子树相同,左子树的右子树要和右子树的左子树相同,则两棵子树是对称的。可以用递归来解决此问题,当然也可以用迭代的方式,可以维护一个队列,每次取两个结点,将两个结点的左右子结点按照相反的顺序存如队列(如q.add(t1.left);q.add(t2.right);q.add(t1.right);q.add(t2.left);),队列为空,或者检测到不对称(连续取出两个结点与前一个结点不同)时,算法结束。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool symmetric(TreeNode *left, TreeNode *right){
if(left && right){
if(left->val != right->val) return false;
return symmetric(left->left, right->right) && symmetric(left->right, right->left);
}
else if(!left && !right) return true;
return false;
}
bool isSymmetric(TreeNode* root) {
if(!root) return true;
return symmetric(root->left, root->right);
}
};