对称二叉树-C++
对称的二叉树
http://www.nowcoder.com/questionTerminal/ff05d44dfdb04e1d83bdbdab320efbcb
本题思路较为简单:主要比较左子树和右子树是否对称,即比较左子树的右子树是否与右子树的左子树相同,且左子树的左子树与右子树的右子树相同。(有点绕/笑哭,其实开始我向想叉了,以为题目是要比较左子树和右子树是否完全相同了)。
主要思路:
- 判断输入的节点是否为空或为叶子节点,如果是的话直接返回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; } } } };