法一:递归。
对于两个对称位置的节点L和R(L在左子树,R在右子树),只有当L的左节点值==R的右节点值且L的右节点值==R的左节点值时,这棵二叉树才有可能对称。另外还需要特判一下nullptr的情况。
/**
* 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 check(TreeNode*l,TreeNode*r)
{
if(!l&&!r) return true;
if(!l||!r) return false;
return l->val==r->val&&check(l->left,r->right)&&check(l->right,r->left);
}
bool isSymmetric(TreeNode* root)
{
if(root&&root->left==nullptr&&root->right==nullptr) return true;
return check(root->left,root->right);
}
};
法二:迭代。如上文所说,对于对称位置的L、R,只有当...时才有可能对称,因此我们只需要将L的左节点与R的右节点匹配、L的右节点和R的左节点匹配。考虑使用队列,取出两次对头匹配即可。本质上还是层序遍历,只不过遍历到一个节点的同时也在遍历它对称位置的节点。
/**
* 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)
{
if(root==nullptr) return true;
queue<TreeNode*>que;
que.push(root->left);
que.push(root->right);
while(!que.empty())
{
TreeNode*lhs=que.front();que.pop();
TreeNode*rhs=que.front();que.pop();
if(lhs==nullptr&&rhs==nullptr)//有对称的可能
{
continue;
}
if(lhs==nullptr&&rhs!=nullptr) return false;
if(rhs==nullptr&&lhs!=nullptr) return false;
else if(lhs->val!=rhs->val) return false;
que.push(lhs->left);que.push(rhs->right);
que.push(lhs->right);que.push(rhs->left);
}
return true;
}
};