题目:
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3]
是对称的。
示例:
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3]
则不是镜像对称的:
1
/ \
2 2
\ \
3 3
进阶:
你可以运用递归和迭代两种方法解决这个问题吗?
题目比较简单,尤其是递归,对于对称的两个节点t1,t2主要需要比较三个值:t1与t2节点的val,t1子左节点和t2子右节点、t1子右节点和t2子左节点,还需判断NULL的特殊情况,实现代码如下
class Solution {
public:
bool isEqual(TreeNode* l,TreeNode* r){
if(r==NULL&&l==NULL)
return true;
else if(r==NULL||l==NULL)
return false;
else
return (l->val==r->val)&&isEqual(l->left,r->right)&&isEqual(l->right,r->left);
}
bool isSymmetric(TreeNode* root) {
if(root==NULL)
return true;
return isEqual(root->left,root->right);
}
};
运行结果:
不是很稳定,0 4 8ms都有,看了下大家代码都差不多,没有只是代码风格不同而已
迭代的方法需要动态维护,之前写中序遍历用的队列,这里就没多想,只需要注意插入队列时要对称插入,实现代码如下:
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(root==NULL)
return true;
queue<TreeNode*> q;
q.push(root->left);
q.push(root->right);
while(!q.empty()){
TreeNode* t1=q.front();
q.pop();
TreeNode* t2=q.front();
q.pop();
if(!t1&&!t2)
continue;
else if(!t1||!t2)
return false;
else if(t1->val!=t2->val)
return false;
//对称插入
q.push(t1->left);
q.push(t2->right);
q.push(t1->right);
q.push(t2->left);
}
return true;
}
};
运行结果:
官方的实现默认插入两个root,感觉平凡无故的增加了计算量,没必要。