递归方法
核心思想就是,左子树的左子树等于右子树的右子树,左子树的右子树等于右子树的左子树:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
bool isSymmetrical(TreeNode* pRoot) {
if(!pRoot) return true;
return comRoot(pRoot->left, pRoot->right);
}
bool comRoot(TreeNode *left, TreeNode *right){
if(!left && !right) return true;
if(!left || !right) return false;
return left->val == right->val
&& comRoot(left->left, right->right)
&& comRoot(left->right, right->left);
}
};
非递归方法
可以采用DFS的非递归解决:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
bool isSymmetrical(TreeNode* pRoot) {
if(!pRoot) return true;
stack<TreeNode*> s;
s.push(pRoot->left);
s.push(pRoot->right);
while(!s.empty()){
TreeNode *right = s.top(); //成对取出
s.pop();
TreeNode *left = s.top();
s.pop();
if(!left && !right) continue;
if(!left || !right) return false;
if(left->val != right->val) return false;
s.push(left->left); //成对放入
s.push(right->right);
s.push(left->right);
s.push(right->left);
}
return true;
}
};
也可以采用BFS的思想:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
bool isSymmetrical(TreeNode* pRoot) {
if(!pRoot) return true;
queue<TreeNode*> q;
q.push(pRoot->left);
q.push(pRoot->right);
while(!q.empty()){
TreeNode *left = q.front(); //成对取出
q.pop();
TreeNode *right = q.front();
q.pop();
if(!left && !right) continue;
if(!left || !right) return false;
if(left->val != right->val) return false;
q.push(left->left); //成对放入
q.push(right->right);
q.push(left->right);
q.push(right->left);
}
return true;
}
};