给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
说明:
如果你可以运用递归和迭代两种方法解决这个问题,会很加分。
层次遍历的方法效率太低,然后我又尝试用递归来判断是否对称
思路:先判断左右子树的根节点是否存在,如果存在先判断它们的值是否相等,相等的话再判断左子树的左节点与右子树的右节点是否相等,以及左子树的右节点与右子树的左节点是否相等,如果全部满足以上条件,则为对称二叉树。
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(!root) return true;//二叉树为空的情况,这里返回true,不是false
else
return judge(root->left,root->right);
}
bool judge(TreeNode* left,TreeNode* right){
if(!left&&!right) return true;
else if(left&&right&&left->val==right->val&&judge(left->left,right->right)&&judge(left->right,right->left)) return true;
else return false;
}
};
对称二叉树的问题可以考虑利用层次遍历,这里可以参考下我另一篇博客:leetcode 102.二叉树的层次遍历
先从左到右遍历一遍,同时从右到左再遍历一遍,比较遍历的结果是否相等;注意为NULL的节点这里采取了加入一个值为233的节点的方法。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
//原解法:
/*class Solution {
public:
bool isSymmetric(TreeNode* root) {
queue <TreeNode*> que;
queue <TreeNode*> que_right;//按照从右到左的顺序层次遍历
TreeNode* node=new TreeNode(233);//遇到空节点,用值为233的节点代替,
//本来用-1和-99,结果测试用例里面有,真是丧心病狂
if(!root) return true;//二叉树为空的情况,这里返回true,不是false
que.push(root);
que_right.push(root);
while(!que.empty()){
int num=que.size();//储存当前层次节点个数
TreeNode* tmp;
TreeNode* tmp_right;
while(num--){
tmp=que.front();//按先进先出的顺序依次读取队列中的节点
tmp_right=que_right.front();
if(tmp->val!=tmp_right->val) return false;
que.pop();//删除queue的第一个元素
que_right.pop();
if(tmp->left!=NULL) que.push(tmp->left);//按顺序储存当前层次各个节点的子节点
else {if(tmp->val!=233)que.push(node);}
if(tmp->right!=NULL) que.push(tmp->right);
else {if(tmp->val!=233)que.push(node);}
//按从右边开始的顺序储存当前层次各个节点的子节点
if(tmp_right->right!=NULL) que_right.push(tmp_right->right);
else {if(tmp->val!=233)que_right.push(node);}
if(tmp_right->left!=NULL) que_right.push(tmp_right->left);
else {if(tmp->val!=233)que_right.push(node);}
}
}
return true;
}
};*/