方法一:递归法
思路: 对某两个对称节点n1(左),n2(右),我们只需要比较n1的左节点和n2的右节点,n1的右节点和n2的左节点,是否相等即可。然后一直递归调用即可。
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(!root) return true;
return helper(root->left,root->right);
}
bool helper(TreeNode* left,TreeNode* right)
{
if(!left&&!right) return true;
if((!left&&right)||(left&&!right)||(left->val!=right->val)) return false;
return helper(left->left,right->right)&&helper(left->right,right->left);
}
};
方法二:迭代法
思路:借助两个队列queue来分别存储root的左右子树中的以每个节点为根的子树,然后按照对称的顺序逐个放入队列末尾,并从队列前取出一个进行比较。
class Solution {
public:
bool isSymmetric(TreeNode* root) {
queue<TreeNode*> q1,q2;
if(!root) return true;
q1.push(root->left);
q2.push(root->right);
while(!q1.empty()&&!q2.empty())
{
TreeNode* node1=q1.front();q1.pop();
TreeNode* node2=q2.front();q2.pop();
if(!node1&&!node2) continue;
if((!node1&&node2)||(node1&&!node2)||(node1->val!=node2->val)) return false;
q1.push(node1->left);
q1.push(node1->right);
q2.push(node2->right);
q2.push(node2->left);
}
return true;
}
};