/*
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==nullptr)
return true;
else
return reversable(pRoot->left,pRoot->right);
}
bool reversable(TreeNode* leftNode,TreeNode* rightNode)
{
//递归出口
if((leftNode==nullptr&&rightNode!=nullptr)||(leftNode!=nullptr&&rightNode==nullptr))//如果发现有这2种情况提前退出递归不用再向下
return false;
if(leftNode==nullptr&&rightNode==nullptr)//递归到底,按照定义应该返回true
return true;
if(leftNode->val!=rightNode->val)//这个情况也不必向下,写在这里是为了防止取空指针的值
return false;
//递归判断对称结点是否相等
bool leftEqulity=reversable(leftNode->right, rightNode->left);
bool rightEqulity=reversable(leftNode->left,rightNode->right);
//返回结果
return leftEqulity==0?leftEqulity:rightEqulity;
}
};
对于根结点的单个子树来说实际上是后序遍历



京公网安备 11010502036488号