题目:
给定一个二叉树,检查它是否是镜像对称的。
/**
* 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 compare(TreeNode* left,TreeNode* right)
// {
// if(left == nullptr && right == nullptr) return true;
// else if(left == nullptr && right != nullptr) return false;
// else if(left != nullptr && right == nullptr) return false;
// else if(left->val != right->val) return false;
// // 这里开始写递归
// else
// {
// bool outside = compare(left->left, right->right);
// bool inside = compare(left->right,right->left);
// // 第一次这里判断写错了,
// // 你想想最后的返回值取决于最终的两个bool类型相与的结果
// // 所以不用再自己判断了,就直接返回这两个bool类型变量相与的结果即可
// return outside && inside;
// }
// }
// bool isSymmetric(TreeNode* root) {
// if(root==nullptr) return true;
// return compare(root->left, root->right);
// }
/*****************************法二::迭代法******************************/
bool isSymmetric(TreeNode* root)
{
queue<TreeNode*> que;
if( root == nullptr) return true;
que.push(root->left);
que.push(root->right);
while(!que.empty())
{
TreeNode* left = que.front();
que.pop();
TreeNode* right = que.front();
que.pop();
if(left == nullptr && right == nullptr)
{
// 这里跟递归不一样的是不能写 return true;
// 要写continue 也就是进行下一轮的循环
continue;
}
else if(left != nullptr && right == nullptr) return false;
else if(left == nullptr && right != nullptr) return false;
else if(left->val != right->val) return false;
else
{
// 这里不用判断 left->left 是否为空,因为若为空也得加进去,
// 等进行下一层判断 自然是可以判断出来的
que.push(left->left);
que.push(right->right);
que.push(left->right);
que.push(right->left);
}
}
// 也就是比较完了所有对应位置的节点,都没return false
// 因此return true;
return true;
}
};