给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
方法1
根左右遍历一次树得到数组,根右左遍历一次得到数组
对比,相等则对称
存在根左右与根右左相等的子树,便使用某个数来标记全部空结点防止出现这种情况
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
void leorder(TreeNode*root,vector <int>&arrleft)
{
if(!root){arrleft.push_back(-1);return;}
arrleft.push_back(root->val);
leorder(root->left,arrleft);
leorder(root->right,arrleft);
}
void riorder(TreeNode*root,vector <int>&arrright)
{
if(!root){arrright.push_back(-1);return;}
arrright.push_back(root->val);
riorder(root->right,arrright);
riorder(root->left,arrright);
}
bool isSymmetric(TreeNode* root) {
vector<int>arrleft;
vector<int>arrright;
leorder(root,arrleft);
riorder(root,arrright);
if(arrleft==arrright)return 1;
else return 0;
}
};
当然,这个方法不够聪明
方法二:
使用两个指针分部从左边右边遍历即可,使用原理为递归
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool check(TreeNode*p,TreeNode* q)
{
if(!q&&!p)return true;
if(!p||!q)return false;
return (p->val==q->val)
&&check(p->left,q->right)
&&check(p->right,q->left);
}
bool isSymmetric(TreeNode* root) {
return check(root,root);
}
};
方法三:
利用队列,类似于层序遍历来迭代它,也可以说是广度搜索(或许
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool check(TreeNode* u,TreeNode* v)
{
queue<TreeNode*>que;
que.push(u);que.push(v);
while(!que.empty())
{ u=que.front();que.pop();
v=que.front();que.pop();
if(!u&&!v)continue;
if((!u||!v)||u->val!=v->val)return false;
que.push(u->left);
que.push(v->right);
que.push(u->right);
que.push(v->left);
}
return true;
}
bool isSymmetric(TreeNode* root) {
return check(root,root);
}
};