问题
思路
这个题关键是要能想到去把左右两枝分开。
对于一个树来说是否对称,这个问题转化为它的左子树,和它的右子树是否对称。分开成两棵树之后,剩下的就好判断了。对于p和q而言,判断跟节点是否对称,左子树是否对称,右子树是否对称。本质还是一个先根遍历。
但是要注意,由于是对称的,所以参数传递也是对称的,p的左子树和q的右子树。
代码
/*
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 isSymmetrical( pRoot->left, pRoot->right );
}
private:
bool isSymmetrical(TreeNode* p, TreeNode* q){
if(!p && !q) return true;
else if( (p&&!q) || (!p&&q) ) return false;
else{
if( p->val != q->val ) return false;
else return isSymmetrical( p->left, q->right ) && isSymmetrical(p->right, q->left);
}
}
};