重点:
(1)递归:判断当前节点是否相等,再判断当前节点的左右子树对应是否相等;
(2)迭代:队列实现层次遍历;
难度简单
给你一个二叉树的根节点 root , 检查它是否轴对称。
示例 1:

输入:root = [1,2,2,3,4,4,3] 输出:true
示例 2:

输入:root = [1,2,2,null,3,null,3] 输出:false
提示:
[1, 1000] 内-100 <= Node.val <= 100判断对称。即判断根节点的左右子树,其每个节点是否相等,并且左子树的左节点是否等于右子树的右节点,左子树的右节点是否等于右子树的左节点。
在每个dfs中,
(1)判断当前节点是否相等,不等就直接返回false;
(2)再判断左子树左节点和右子树右节点,左子树右节点和右子树左节点是否跟别相等;
显然,我们这里应该使用层次遍历,所以定义队列queue为数据结构。那么根据对称性,将左右子树分别入队列,每蹭的节点顺序一个顺序一个逆序。
- //递归
- class Solution {
- public:
- bool isSymmetric(TreeNode* root) {
- if(root!=nullptr)
- return dfs(root->left,root->right);
- return true;
- }
- bool dfs(TreeNode* root1,TreeNode* root2){
- if(root1==nullptr&&root2==nullptr)
- return true;
- if(root1==nullptr||root2==nullptr)
- return false;
- if(root1->val!=root2->val)
- return false;
- return dfs(root1->left,root2->right)&&dfs(root1->right,root2->left);
- }
- };
- //迭代
- class Solution {
- public:
- bool isSymmetric(TreeNode* root) {
- if(root!=nullptr)
- return bfs(root->left,root->right);
- return true;
- }
- bool bfs(TreeNode* u,TreeNode* v){
- queue
que; - que.push(u);
- que.push(v);
- while(!que.empty()){
- u=que.front();que.pop();
- v=que.front();que.pop();
- if(u==nullptr&&v==nullptr)
- continue;
- if(u==nullptr||v==nullptr)
- return false;
- if(u->val!=v->val)
- return false;
- que.push(u->left);que.push(v->right);
- que.push(u->right);que.push(v->left);
- }
- return true;
- }
- };