题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的
思路
定义一种遍历算法,先遍历右子节点再遍历左子节点;如对称先序遍历:根节点-》右子节点=》左子节点
而先序遍历:根节点-》左子节点-》右子节点
通过比较二叉树的先序遍历和对称先序遍历的序列是否相同来判断二叉树是否对称。
注意:因为二叉树的元素可能全部相同,所以将遍历过程中的nullptr也考虑进来。
/*
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 isSymmetrical(pRoot,pRoot);
}
// 比较二叉树的先序遍历序列和对称先序遍历序列(根->右->左)
// 相等:对称
bool isSymmetrical(TreeNode* pRoot1, TreeNode *pRoot2){
// 因为可能存在所有元素相等的情况;遍历序列考虑nullptr
if(pRoot1 == nullptr && pRoot2 == nullptr)
return true;
// 一个空指针,另一个非空指针
if (pRoot1 == nullptr || pRoot2 == nullptr)
return false;
if (pRoot1->val != pRoot2->val )
return false;
return isSymmetrical(pRoot1->left,pRoot2->right) &&
isSymmetrical(pRoot1->right,pRoot2->left) ;
}
};```