题目:
给定一个二叉树,检查它是否是镜像对称的。
示例:
二叉树 [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
题解1:
思路:利用BFS,针对两棵相同的树来扫描,每次入队的都是对称位置的两个结点,在处理的过程中也是两两处理。要注意的是,两个结点都是空结点属于对称的情况。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool check(TreeNode* root1,TreeNode* root2){
if(!root1)
return false;
queue<TreeNode*> q;
TreeNode* m,*n;
//针对两棵相同的树,左边的树和右边的树对应,两两对称进行比较
q.push(root1);
q.push(root2);
while(!q.empty()){
//每次处理两个
m=q.front();q.pop();
n=q.front();q.pop();
//这一步很关键,两个结点同时为空的情况属于对称
//应该与下一个判断语句分开
if (!m && !n) continue;
//如果有一个为空肯定是不对称的,或者二者的值不相同
if((!m||!n)||m->val!=n->val) return false;
//每次送入两个理论上的对称节点
q.push(m->left);
q.push(n->right);
q.push(m->right);
q.push(n->left);
}
return true;
}
bool isSymmetric(TreeNode* root) {
return check(root,root);
}
};