一、题目描述与要求
题目描述
给你一个二叉树的根节点 root
, 检查它是否轴对称。
示例
示例1:
输入:root = [1,2,2,3,4,4,3]
输出:true
示例2:
输入:root = [1,2,2,null,3,null,3]
输出:false
提示
- 树中节点数目在范围
[1, 1000]
内 -100 <= Node.val <= 100
二、解题思路
总的思路:
要判断一颗二叉树是否轴对称要从两个方面进行,结构与结点值。首先判断是否为空树,如果是空树不用判断,肯定是轴对称;接着如果树不为空那就要考虑根结点的左子树与右子树是否结构与对应结点的值相同,这里指的对应不像100.相同的树一样左对左,而是树本身进行比较,根据轴对称图形,应当是左子树的左孩子要与右子树的右孩子相对应,左子树的右孩子要与右子树的左孩子对应。因此在这一步进行判断的时候可以另外写一个函数,然后递归调用这一函数对整棵树进行遍历。首先就是如果左右子树都为空那肯定轴对称,返回true,如果有一颗为空,则不为轴对称,返回false,如果出现有一个结点的值不相等则直接返回false,如果相等则继续调用函数去判断目前结点的左右子树与兄弟结点的左右子树是否相同。
具体步骤:
1、判断二叉树是否为空
2、判断左右子树的结构与值是否相等
3、递归调用函数遍历二叉树
4、返回结果。
三、具体代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool compare(struct TreeNode* left,struct TreeNode* right)
{
if(left==NULL&&right==NULL)//如果二叉树根节点存在但是左右子树都为空则为轴对称,返回true
{
return true;
}
else if(left==NULL||right==NULL)//左右子树中有一颗为空树,另一颗不为空树,肯定不是轴对称,返回false
{
return false;
}
else if(left->val!=right->val)//如果左右子树中结点的值不相同则不为轴对称,返回false
{
return false;
}
else
{ //如果上述比较都相等那么就对目前结点的左右子树继续进行比较,此时注意轴对称应当是左子树的左孩子与右子树的右孩子相同,左子树的右孩子与右子树的左孩子相同。通过递归来实现对每个结点的比较
return compare(left->left,right->right)&&compare(left->right,right->left);
}
}
bool isSymmetric(struct TreeNode* root){
if(root==NULL)//如果二叉树为空树,则肯定是轴对称,返回true
return true;
else
{
return compare(root->left,root->right);
}
}