题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
思路:
要保证一个二叉树与其镜像是相同的,那么也就是从根结点开始,左子树的左子树等于右子树的右子树,递归。
/*
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)
return true;
return IsSym(pRoot->left, pRoot->right);
}
bool IsSym(TreeNode* pLeft, TreeNode* pRight)
{
if(!pLeft)
return pRight == NULL;
if(!pRight)
return false;
if(pLeft->val != pRight->val)
return false;
return IsSym(pLeft->left, pRight->right) && IsSym(pLeft->right, pRight->left);
}
};
非递归:
采用前序、中序、后序、层次遍历等任何一种遍历方法,分为先左后右和先右后左两种方法,只要两次结果相等就证明该二叉树是一棵对称二叉树。
/*
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)
return true;
queue<TreeNode* > q1, q2;
q1.push(pRoot->left);
q2.push(pRoot->right);
while(!q1.empty() && !q2.empty())
{
TreeNode* pLeft = q1.front();
q1.pop();
TreeNode* pRight = q2.front();
q2.pop();
if(!pLeft && !pRight)
continue;
if(!pLeft || !pRight)
return false;
if(pLeft->val != pRight->val)
return false;
q1.push(pLeft->left);
q1.push(pLeft->right);
q2.push(pRight->right);
q2.push(pRight->left);
}
return true;
}
};