题目难度:简单
一、题目描述
给你一个二叉树的根节点 root
, 检查它是否轴对称。
LeetCode链接:101. 对称二叉树 - 力扣(LeetCode)
二、解题思路
核心思路:
- 怎么判断一棵树是不是对称二叉树? 答案:如果所给根节点,为空,说明是对称的。如果根节点不为空,当它的左子树与右子树对称时,说明是对称的。
- 怎么判断左树与右树是否对称呢?答案:如果左树的左孩子等于右树的右孩子、左树的右孩子等于右树的左孩子,那么这个左树和右树就对称。
- 先比较左树和右树的根节点:
- 如果「都为空」,说明是对称的,返回 true
- 如果「一个为空一个不为空」,说明是不对称的,返回 false
- 如果「都不为空,但它们的值不相等」,说明是不对称的,返回 false
- 经过 1 和 2 和 3 的判断,说明左树和右树的根节点「都不为空,且节点值相同」,我们继续递归遍历,判断左树的左孩子和右树的右孩子、左树的右孩子和右树的左孩子是否相等
递归过程演示:
依次比较左子树和右子树中的「当前树(1、2、3)的根节点」是否相等。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
// 判断左子树和右子树是否对称(自己写的子函数)
bool _isSymmetric(struct TreeNode* root1, struct TreeNode* root2)
{
// 轴对称条件:左树的左孩子等于右树的右孩子
// 左树的右孩子等于右树的左孩子
// 先比较左树和右树的根节点
// 1. 都为空,说明是对称的,返回true
if (root1 == NULL && root2 == NULL)
{
return true;
}
// 2. 一个为空一个不为空,说明是不对称的,返回false
if (root1 == NULL || root2 == NULL)
{
return false;
}
// 3. 都不为空,且它们的值不相等,说明是不对称的,返回false
if (root1->val != root2->val)
{
return false;
}
// 经过前面的if的判断,既然运行到这里了,说明左树和右树的根节点值相等
// 4. 继续递归遍历,判断左树的左孩子和右树的右孩子、左树的右孩子和右树的左孩子是否相等
return _isSymmetric(root1->left, root2->right)
&& _isSymmetric(root1->right, root2->left);
}
bool isSymmetric(struct TreeNode* root){
// 根节点为空,说明是对称的
if(root == NULL)
{
return true;
}
// 根节点不为空,判断它的左子树和右子树是否对称
return _isSymmetric(root->left, root->right);
}