题目描述:
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
进阶:
你可以运用递归和迭代两种方法解决这个问题吗?
方法1:递归
主要思路:
(1)这个和比较两棵树的异同有点像,只不过将比较的结点从左左,右右,变化为了左右,右左的方式;
/**
* 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 helper(TreeNode* root_l,TreeNode* root_r){
if(!root_l&&!root_r)//结点都为空的情形
return true;
//结点不满足要求的情形
if((root_l&&!root_r)||(!root_l&&root_r)||(root_l->val!=root_r->val))
return false;
//递归的结点从左左,右右,变化为了左右,右左的方式;
return helper(root_l->left,root_r->right)&&helper(root_l->right,root_r->left);
}
bool isSymmetric(TreeNode* root) {
if(root==NULL)
return true;
return helper(root,root);//将原来的一颗树,转化为对两颗树的比较
}
};
方法2:使用两个栈实现迭代
主要思路:
(1)思路和方法 1 一样,只不过使用栈来实现;
/**
* 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 helper(TreeNode* p,TreeNode* q){
//判断根节点的情形
if(!p&&!q)
return true;
if((!p&&q)||(p&&!q)||(p->val!=q->val))
return false;
//分别存储两个树的栈
stack<TreeNode*> st_p;
stack<TreeNode*> st_q;
st_p.push(p);
st_q.push(q);
//存储过程是一样的,故只使用一个栈即可作为终止条件
while(!st_p.empty()){
//获得当前的要比较的两棵树的两个结点
p=st_p.top();
st_p.pop();
q=st_q.top();
st_q.pop();
//比较左 ,右结点
//比较满足要求的情形
if(p->left&&q->right&&p->left->val==q->right->val){
st_p.push(p->left);
st_q.push(q->right);
}
//不满足要求,要返回false的情形
else if((!p->left&&q->right)||(p->left&&!q->right)||(p->left&&q->right&&p->left->val!=q->right->val))
return false;
//比价右 ,左结点
if(p->right&&q->left&&p->right->val==q->left->val){
st_p.push(p->right);
st_q.push(q->left);
}
else if((!p->right&&q->left)||(p->right&&!q->left)||(p->right&&q->left&&p->right->val!=q->left->val))
return false;
}
//遍历结束,返回true
return true;
}
bool isSymmetric(TreeNode* root) {
return helper(root,root);//直接调用辅助函数,将比较对称转化为比较两棵树的异同
}
};