题目链接:
力扣https://leetcode.cn/problems/symmetric-tree/submissions/
解题思路:
1. 首先要明确从二叉树的逻辑结构来说,对称并不是对称轴左右俩边的结点值相同,例如:
该图中的二叉树就不是对称的
2. 要想判断是否为对称二叉树,则需要左子树与右子树去进行比较,即它们的比较是相反的。而且根结点的值相同
3. 需要创建一个自定义比较函数用来比较,也包括比较一边的子树为空,而另一边的子树不为空的情况
4. 由此我们可以了解到,当问题的本质是左子树与右子树的相互比较时,其比较的则是二叉树中每一层的结点,而每一层的结点依次又往下延伸出新的结点,而该类比较就需要考虑其中一个子树为空,另一个子树不为空的特殊情况
代码实现:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool check(struct TreeNode *root1,struct TreeNode *root2)//创建一个比较函数
{
if(root1 == NULL && root2 == NULL)
{
return true;
}
if(root1 == NULL || root2 == NULL)//创建函数的意义
{
return false;
}
if(root1->val != root2->val)
{
return false;
}
return check(root1->left,root2->right)&&check(root1->right,root2->left);
/*根据题意来确定check函数的参数,因为对称是要比较一边的左子树与另一边的右子树
注意不要误以为只比较一边就行,
需要将一边的左子树与另一边的右子树比较
还得将另一边的右子树与一边的左子树相比较
理由是:题目中给出的二叉树并不都是满二叉树*/
}
bool isSymmetric(struct TreeNode* root)
{
if (root == NULL)
{
return true;
}
/*if (root->left)此类解法不能解决其中一个子树为空的特殊情形
{
if(root->left->val != root->right->val)
return false;
}
return isSymmetric(root->left)&&isSymmetric(root->right);*/
return check(root->left,root->right);
}