题目描述:
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

思路:如果两棵树是对称的,则按照根左右和根右左的遍历顺序,得到的结果应该是一样的,但是当树中所有节点的值都相等的时候,结果也是一样的但是不是对称树,这个时候需要添加上对nullptr的访问顺序,当访问到了nullptr时,指定一个数值即可(这里给定-1)。

/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
//只需要按照对称的顺序去遍历二叉树即可,最后判断两个遍历的结果是否相等即可
bool isSymmetrical(TreeNode* pRoot)
{
if(pRoot==nullptr)
return true;
vector<int> shun;
vector<int> ni;
travel1(pRoot,shun);
travel2(pRoot,ni);
if(shun==ni)
return true;
else
return false;
}
void travel1(TreeNode* pRoot,vector<int> &shun){
if(pRoot==nullptr){
shun.push_back(-1);
return ;
}
shun.push_back(pRoot->val);
travel1(pRoot->left,shun);
travel1(pRoot->right,shun);
}
void travel2(TreeNode* pRoot,vector<int> &ni){
if(pRoot==nullptr){
ni.push_back(-1);
return ;
}
ni.push_back(pRoot->val);
travel2(pRoot->right,ni);
travel2(pRoot->left,ni);
}
};
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
bool isSymmetrical(TreeNode* pRoot)
{
return issymmetric(pRoot,pRoot);
}
//原树和镜像树对应的节点进行比较判断
bool issymmetric(TreeNode* pRoot1,TreeNode* pRoot2){
if(pRoot1==nullptr&&pRoot2==nullptr)
return true;
if(pRoot1==nullptr||pRoot2==nullptr)
return false;
if(pRoot1->val==pRoot2->val)
//对左右子树分别遍历
return issymmetric(pRoot1->left,pRoot2->right)&&issymmetric(pRoot1->right,pRoot2->left);
else{
return false;
}
}
};