本题思路较为简单:主要比较左子树和右子树是否对称,即比较左子树的右子树是否与右子树的左子树相同,且左子树的左子树与右子树的右子树相同。(有点绕/笑哭,其实开始我向想叉了,以为题目是要比较左子树和右子树是否完全相同了)。
主要思路:
- 判断输入的节点是否为空或为叶子节点,如果是的话直接返回true;
- 递归比较当前节点的左子树和右子树是否对称:
(1)如果左树和右树都到达叶子节点,若值相等则返回true,不相等返回false;
(2)如果左树的左子树与右树的右子树均为空,则返回true;
如果左树的左子树为空且右树的右子树不为空,则返回false;
如果左树的左子树不为空且右树的右子树不为空,则返回false;
如果左树的左子树不为空且右树的右子树不为空的情况下,递归进行下一步的比较;
(3)只有当左树的左子树与右树的右子树相同的情况下,进一步按上述方法比较左树的右子树与右树的左子树,直到均相同返回true,否则返回false。
代码实现如下:
/*
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 || (pRoot->left==NULL && pRoot->right==NULL)){
return true;
}
return judgeSolve(pRoot->left,pRoot->right);//判断左右子树是否相等
}
private:
bool judgeSolve(TreeNode* leftRoot,TreeNode* rightRoot){
//到达叶子节点
if((leftRoot->left==NULL&&leftRoot->right==NULL) &&
(rightRoot->left==NULL&&rightRoot->right==NULL)){
if(leftRoot->val == rightRoot->val){
return true;
}
else{
return false;
}
}
if(leftRoot->val != rightRoot->val){
return false;
}
else{
//继续比较两棵树的左右子树是否相等
bool leftFlag=false;
bool rightFlag=false;
if(leftRoot->left==NULL && rightRoot->right==NULL){
leftFlag=true;
}
else if((leftRoot->left==NULL&&rightRoot->right!=NULL) ||
(leftRoot->left!=NULL&&rightRoot->right==NULL)){
leftFlag=false;
return false;
}
else{
leftFlag=judgeSolve(leftRoot->left,rightRoot->right);
}
//左子树相同再比较右子树
if(leftFlag==true){
if(leftRoot->right==NULL && rightRoot->left==NULL){
rightFlag=true;
}
else if((leftRoot->right==NULL&&rightRoot->left!=NULL) ||
(leftRoot->right!=NULL&&rightRoot->left==NULL)){
return false;
}
else{
rightFlag=judgeSolve(leftRoot->right,rightRoot->left);
}
if(rightFlag==true){
return true;
}
else{
return false;
}
}
else{
return false;
}
}
}
};
京公网安备 11010502036488号