题解 | #对称的二叉树#
对称的二叉树
http://www.nowcoder.com/practice/ff05d44dfdb04e1d83bdbdab320efbcb
第二十三题 简单 递归判断左右是否相等
/*
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)
return true;
bool ret_ans=true;
// 如果说 左右两颗子树都是空 则是true
if(pRoot->left==NULL && pRoot->right == NULL)
return ret_ans;
// 如果说一边有 一遍无 则肯定错
// 因为is_equal 传递的是整个树 所以不需要下面的判断,如果说 传入的只是左子树 和右子树 则要判断
// if( (pRoot->left == NULL && pRoot->right!=NULL) || (pRoot->right == NULL && pRoot->left!=NULL))
// return false;
// ret_ans = is_equal(pRoot->left, pRoot->right);
ret_ans = is_equal(pRoot, pRoot);
return ret_ans;
}
// 递归判断 传入左右两棵子树 判断是否相等
bool is_equal(TreeNode* left,TreeNode* right)
{
if(left==NULL && right==NULL)
return true;
// 如果说一边有 一遍无 则肯定错
if( (left == NULL && right!=NULL) || (right == NULL && left!=NULL) || left->val!=right->val )
return false;
bool ans=true;
// 镜像判断
// 递归调用结果 判断是否相等 左边的左子树 和右边的右子树
ans = is_equal(left->left,right->right);
// 有错 则往后 肯定都是错的
if(ans==false)
return false;
// 判断 左边的右子树 和 右边的左子树
ans = is_equal(left->right,right->left);
return ans;
}
};
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)
return true;
bool ret_ans=true;
// 如果说 左右两颗子树都是空 则是true
if(pRoot->left==NULL && pRoot->right == NULL)
return ret_ans;
// 如果说一边有 一遍无 则肯定错
// 因为is_equal 传递的是整个树 所以不需要下面的判断,如果说 传入的只是左子树 和右子树 则要判断
// if( (pRoot->left == NULL && pRoot->right!=NULL) || (pRoot->right == NULL && pRoot->left!=NULL))
// return false;
// ret_ans = is_equal(pRoot->left, pRoot->right);
ret_ans = is_equal(pRoot, pRoot);
return ret_ans;
}
// 递归判断 传入左右两棵子树 判断是否相等
bool is_equal(TreeNode* left,TreeNode* right)
{
if(left==NULL && right==NULL)
return true;
// 如果说一边有 一遍无 则肯定错
if( (left == NULL && right!=NULL) || (right == NULL && left!=NULL) || left->val!=right->val )
return false;
bool ans=true;
// 镜像判断
// 递归调用结果 判断是否相等 左边的左子树 和右边的右子树
ans = is_equal(left->left,right->right);
// 有错 则往后 肯定都是错的
if(ans==false)
return false;
// 判断 左边的右子树 和 右边的左子树
ans = is_equal(left->right,right->left);
return ans;
}
};
题解 文章被收录于专栏
一遍做剑指offer 一边保存做题步骤 并附带详细注释哦