题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
解题思路
首先说一下做这道题目最初的错误想法:
想到了二叉树的中序遍历,中序遍历序列对称则二叉树对称,于是写好了程序,系统报错,给出了 { 5 , 5 , 5 , 5 , # , # , 5 , # , 5 } \left\{5,5,5,5,\#,\#,5,\#,5\right\} {5,5,5,5,#,#,5,#,5}(层序遍历)例子,这样的二叉树是非对称的,但是它的中序遍历 [ 5 , 5 , 5 , 5 , 5 ] [5,5,5,5,5] [5,5,5,5,5]显然是对称的,败北。
正确的思路:
二叉树是对称的,要么是空树,要么其左右孩子均存在并且结点相等,而且左子树的左孩子结点要等于右子树的右孩子结点,左子树的右孩子结点要等于右子树的左孩子结点才行。
为此,写出了正确的代码。
代码实现
class Solution {
public:
bool isMirror(TreeNode* pLeft, TreeNode* pRight)//为了改变参数个数 重新定义函数
{
if(!pLeft && !pRight) // 左右孩子均为空 返回真
return true;
if(!pLeft || !pRight) // 如果一个为空 另一个不空 显然为假
return false;
return pLeft->val == pRight->val &&
isMirror(pLeft->left, pRight->right) &&
isMirror(pLeft->right, pRight->left);// 如果左右结点相等 并且其余结点满足镜像 即结点相等 结构对称
}
bool isSymmetrical(TreeNode* pRoot)
{
if(pRoot == NULL)
return true;
return isMirror(pRoot->left, pRoot->right);// 根结点的左子树和右子树进行判断
}
};