本来尝试使用层次遍历,发现根本无法解决,原因是层序遍历没有左右子树的信息。
递归也没什么思路,就直接参考官方题解
递归解法
将问题转化为两棵树什么情况下对称?
- 两个根节点具有相同的值
- 每个树的右子树和另一棵树的左子树镜像对称
代码如下,值得注意的是下面的判断顺序可以实现先判断两者均为nullptr,两者有一个为nullptr,两者均不为nullptr
class Solution {
public:
bool isSymmetric(TreeNode* root) {
return check(root, root);
}
bool check(TreeNode* left, TreeNode* right){
if(left == nullptr && right == nullptr)
return true;
if(left == nullptr || right == nullptr)
return false;
return left->val == right->val && check(left->left, right->right) && check(left->right, right->left);
}
};
迭代
这个解法是之前尝试的层次遍历的正确版本,解决了判断子树的信息
通过引入一个队列,每次提取一对节点时,将左节点的左子节点和右节点的右子节点插入队列中,对称插入余下部分。
class Solution {
public:
bool isSymmetric(TreeNode* root) {
return check(root, root);
}
bool check(TreeNode* left, TreeNode* right){
queue<TreeNode*> nodes;
nodes.push(left);
nodes.push(right);
while(!nodes.empty()){
left = nodes.front();
nodes.pop();
right = nodes.front();
nodes.pop();
if(left == nullptr && right == nullptr)
continue;
if((left == nullptr || right == nullptr) || (left->val != right->val))
return false;
nodes.push(left->left);
nodes.push(right->right);
nodes.push(left->right);
nodes.push(right->left);
}
return true;
}
};