力扣HOT100之二叉树:101. 对称二叉树
这道题我本来想着挑战一下自己,尝试着用迭代的方法来做,然后就是用层序遍历,将每一层的元素收集到一个临时的一维向量中,然后再逐层判断每一层是否都是轴对称的,一旦发现某一层不是轴对称的,就直接return false
,当所有的层都遍历结束后,都没有出现return false
的情况,就说明每一层都是轴对称的,此时直接return true
即可。注意,再判断每一层是否为轴对称时,千万不能用栈来匹配(类似于括号匹配的思路),因为下面的情况用栈会判定为轴对称,但是实际上是非轴对称的。(当时被这个测试样例折磨到红温)
此外,当前层的下一层如果至少有一个非空节点,那么下一层的空节点也必须加入,否则判定也会出问题。
/*** 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 isSymmetric(TreeNode* root) {//用迭代来解决这个问题queue<TreeNode*> My_Queue;stack<TreeNode*> My_Stack;My_Queue.push(root);while(!My_Queue.empty()){int size = My_Queue.size();vector<TreeNode*> temp;while(size > 0){TreeNode* node = My_Queue.front();My_Queue.pop();size--;if(node){My_Queue.push(node -> left);temp.emplace_back(node -> left);My_Queue.push(node -> right);temp.emplace_back(node -> right);} }for(int left = 0, right = temp.size() - 1; left < right;){if((!temp[left] && !temp[right]) || ((temp[left] && temp[right]) && (temp[left] -> val == temp[right] -> val))){left++;right--;}else return false;}}return true;}
};