第一遍是想中序遍历,但是这个例子卡住了:
[1,2,2,2,null,2]
那就老老实实写递归吧:
左右子树相等的时候,需要左子树的左边 == 右子树的右边,左子树的右边 == 右子树的左边。
递归判断。
class Solution {
public:
bool isMirror(TreeNode *p, TreeNode *q){
if(!p && !q) return true;
if(!p || !q) return false;
if(p->val == q->val) return isMirror(p->left, q->right) && isMirror(p->right, q->left);
return false;//p->val != q->val
}
bool isSymmetric(TreeNode* root) {
if(!root) return true;
return isMirror(root->left, root->right);
}
};
如果要使用迭代的话,需要借助外部容器,比如queue:
public:
bool isSymmetric(TreeNode* root) {
if(!root) return true;
queue<TreeNode*> my_q;
my_q.push(root->left);
my_q.push(root->right);
while(!my_q.empty()){
auto p = my_q.front(); my_q.pop();
auto q = my_q.front(); my_q.pop();
if(!p && !q) continue;
if(!p || !q) return false;
if(p->val != q->val) return false;
my_q.push(p->left);
my_q.push(q->right);
my_q.push(p->right);
my_q.push(q->left);
}
return true;
}
};