重点:
(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
解析:
判断对称。即判断根节点的左右子树,其每个节点是否相等,并且左子树的左节点是否等于右子树的右节点,左子树的右节点是否等于右子树的左节点。
方法1:递归
在每个dfs中,
(1)判断当前节点是否相等,不等就直接返回false;
(2)再判断左子树左节点和右子树右节点,左子树右节点和右子树左节点是否跟别相等;
方法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<TreeNode*> 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;
}
};