题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
解法一:
第一种想法,生成一个二叉树镜像,然后比较原二叉树和二叉树镜像即可。这个肯定是没问题,但是有没有必要生成一个二叉树镜像那?因为原二叉树需要保留,不然就没有参照了。所以,涉及到新内存分配,这就会在内存分配和构建对象上花费大量的时间和空间,故转而寻求其他解法。
第二种想法:通过画图,发现原二叉树和二叉树镜像是同样的,就是根节点的左右子树互为镜像即可。
那么根据这个思路,就可以写代码了。
最开始我还把左子树转换成它的镜像了,因为这样不涉及内存分配的时间和空间开销,而且有右子树可以进行对照。后来发现没必要,也是浪费时间啊。
/*
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 symmetrical(pRoot->left, pRoot->right);
}
private:
bool symmetrical(TreeNode* lnode, TreeNode *rnode)
{
if (lnode == NULL && rnode == NULL)
return true;
if ((lnode == NULL && rnode != NULL) || (lnode != NULL && rnode == NULL))
return false;
if (lnode->val != rnode->val)
return false;
return symmetrical(lnode->left, rnode->right) && symmetrical(lnode->right, rnode->left);
}
};
后续:
看了下牛客,发现大家的做法是一样的。就是别人的代码在判断部分看起来更加简洁,需要好好借鉴一下啊。更改代码如下:
bool symmetrical(TreeNode* lnode, TreeNode *rnode)
{
if (lnode == NULL)
return rnode == NULL;
if (rnode == NULL)
return false;
if (lnode->val != rnode->val)
return false;
return symmetrical(lnode->left, rnode->right) && symmetrical(lnode->right, rnode->left);
}