【OJ - 二叉树】对称二叉树

本文解析如何通过递归方法检查给定的二叉树是否轴对称,包括核心思路、比较节点步骤和示例代码。重点在于理解对称性判断条件:左右子树对称。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


题目难度:简单

一、题目描述

给你一个二叉树的根节点 root , 检查它是否轴对称。

image-20220221154946819

LeetCode链接:101. 对称二叉树 - 力扣(LeetCode)


二、解题思路

核心思路

  1. 怎么判断一棵树是不是对称二叉树? 答案:如果所给根节点,为空,说明是对称的。如果根节点不为空,当它的左子树与右子树对称时,说明是对称的。
  2. 怎么判断左树与右树是否对称呢?答案:如果左树的左孩子等于右树的右孩子、左树的右孩子等于右树的左孩子,那么这个左树和右树就对称。
  3. 先比较左树和右树的根节点:
    1. 如果「都为空」,说明是对称的,返回 true
    2. 如果「一个为空一个不为空」,说明是不对称的,返回 false
    3. 如果「都不为空,但它们的值不相等」,说明是不对称的,返回 false
    4. 经过 1 和 2 和 3 的判断,说明左树和右树的根节点「都不为空,且节点值相同」,我们继续递归遍历,判断左树的左孩子和右树的右孩子、左树的右孩子和右树的左孩子是否相等

递归过程演示

依次比较左子树和右子树中的「当前树(1、2、3)的根节点」是否相等。

image-20220221193008193
/**
 * 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);
}

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值