一、递归
/**
* 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 compare(TreeNode* left, TreeNode* right){
if(!left && !right) return true;
if(!right || !left || left->val != right->val) return false;
return compare(left->right, right->left) && compare(left->left, right->right);
}
bool isSymmetric(TreeNode* root) {
if(!root) return true;
return compare(root->left, root->right);
}
};
二、迭代
左子树采用中左右的先序遍历规则,右子树采用右中左的先序遍历规则
/**
* 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:
// 迭代算法(遍历左右子树,判断val是否一致)
bool isSymmetric(TreeNode* root) {
if(!root) return true;
TreeNode* p = root->left;
TreeNode* q = root->right;
stack<TreeNode*> st_1;
stack<TreeNode*> st_2;
while(p && q || !st_1.empty() && !st_2.empty()){
while(p && q){
st_1.push(p);
p = p->left;
st_2.push(q);
q = q->right;
}
if(p != q) return false;
p = st_1.top();
st_1.pop();
q = st_2.top();
st_2.pop();
if(p && !q || q && !p || p->val != q->val) return false;
p = p->right;
q = q->left;
}
if(st_1.size() != st_2.size() || !p && q || p && !q ) return false;
return true;
}
};