题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
/*
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==NULL)
return true;
TreeNode* p1=pRoot;
TreeNode* p2=pRoot;
PreSymmetrical(p1); //标准的前序遍历,先遍历左子树,再根结点,最后遍历右子树
DefineSymmetrical(p2); //自定义的对称前序遍历,先遍历右子树,再根结点,最后遍历
for(int i=0;i<vec1.size();i++) //左子树注意一些特殊情况,比如所有的元素都是相同的,两种
{ //遍历结果可能是一样的,事实上是非对阵的(比如奇数个相同
if(vec1[i]!=vec2[i]) //的值明显不是对阵的,但两种遍历结果相同),因此我们将所
return false; //有的结点的左右结点为空时记为NULL。
}
return true;
}
void PreSymmetrical(TreeNode*p1)
{
if(p1==NULL)
{
vec1.push_back(0);
return;
}
vec1.push_back(p1->val);
PreSymmetrical(p1->left);
PreSymmetrical(p1->right);
}
void DefineSymmetrical(TreeNode*p2)
{
if(p2==NULL)
{
vec2.push_back(0);
return;
}
vec2.push_back(p2->val);
DefineSymmetrical(p2->right);
DefineSymmetrical(p2->left);
}
private:
vector<int> vec1,vec2; //vec1和vec2分别用来存储前序遍历和自定义对称前序遍历的结果
};
本文介绍了一种判断二叉树是否对称的方法。通过对二叉树进行标准前序遍历与自定义对称前序遍历,并比较两者结果来判断。特别地,对于特殊情况如所有节点值相同的情况也进行了考虑。
360

被折叠的 条评论
为什么被折叠?



