////////////////////////////////////////////////////////////////////////////////////////////////////
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3]
是对称的。
1 / \ 2 2 / \ / \ 3 4 4 3
但是下面这个 [1,2,2,null,3,null,3]
则不是镜像对称的:
1 / \ 2 2 \ \ 3 3
说明:
如果你可以运用递归和迭代两种方法解决这个问题,会很加分。
////////////////////////////////////////////////////////////////////////////////////////////////////
先写一个递归的方法,有时间的话改个迭代的。
思路很简单。检查是否“对称”,很自然地想到跟“左右”有关,对称轴在根节点,所以要比较根节点的“左右子树”,自然要同时遍历左右子树了。然而给定的函数只有一个参数,所以要重写一个。
bool isSymmetric(TreeNode *left, TreeNode *right){}
先要从给定的函数中进入到重写的函数。
首先空的树或者只有一个根节点的树肯定是对称的,于是有:
if (root == NULL)
return true;
if (root->left == NULL && root->right == NULL)
return true;
调用重写的函数:
if (isSymmetric(root->left, root->right))
return true;
不满足这三个条件的话,最后返回false。
下面是重写的函数。
如果两个指针同时指向空,说明这次调用之前两个指针已经分别到达了根节点左右子树下的某个叶子节点,且没有返回false,符合对称,所以返回true:
if (left == NULL && right == NULL)
return true;
如果两个指针同时不为空,说明这两个节点存在,需要判断是不是满足对称,并将指针下移,进行下一步判断,也就是开始递归了:
if ((left != NULL && right != NULL) && (left->val == right->val) && isSymmetric(left->left, right->right) && isSymmetric(left->right, right->left))
return true;
需要注意的是,不要忘记“对称”,也不要忘记两个指针分别指向的是根节点的左右子树,所以进行递归时,left和right要向不同的方向移动,得到新的指针作为参数传入函数中。
不满足以上两个判断条件的,返回false即可。
最后贴上完整的代码:
//8ms
class Solution
{
public:
bool isSymmetric(TreeNode *left, TreeNode *right)
{
if (left == NULL && right == NULL)
return true;
if ((left != NULL && right != NULL) && (left->val == right->val) && isSymmetric(left->left, right->right) && isSymmetric(left->right, right->left))
return true;
return false;
}
bool isSymmetric(TreeNode* root)
{
if (root == NULL)
return true;
if (root->left == NULL && root->right == NULL)
return true;
if (isSymmetric(root->left, root->right))
return true;
return false;
}
};