递归
- 从根结点(结点)0开始,判断其左右子树是否对称,即判断「结点1所在子树」和「结点2所在子树」是否对称;
- 为比较这两个子树的对称情况,需要分别比较各自的左右孩子的对称情况,即:比较「结点3所在子树」和「结点4所在子树」是否对称,同时也需要比较「结点5所在子树」和「结点6所在子树」是否对称;
- 依次类推,直至遍历到叶子结点。
/*
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 helper(pRoot->left, pRoot->right);
}
//判断左右是否对称
bool helper(TreeNode* left,TreeNode*right)
{
if((!left&&right)||(left&&!right))//两个结点不同时为空,不对称
return false;
if(!left&&!right) //两个结点同时为空,对称
return true;
if(left->val!=right->val)//两个结点取值不同,不对称
return false;
return helper(left->left, right->right)&&helper(left->right,right->left);
}
};