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