101. 对称二叉树

该博客探讨了一种解决二叉树镜像对称性问题的方法。通过递归方式,比较二叉树的左右子树是否互为镜像,实现了判断一棵二叉树是否对称的功能。关键在于递归过程中比较左右子节点的对应关系,直到找到所有节点的对称匹配或发现不匹配的情况。

描述

给定一个二叉树,检查它是否是镜像对称的。
在这里插入图片描述
进阶:
你可以运用递归和迭代两种方法解决这个问题吗?

思路:

前面的几道题都是把树抽象成只含有root结点和其左右孩子结点的一棵树,然后按照博客中的三部曲来解题。仔细读这道题,发现比较特殊,如果按照这种抽象的方式,那么判断的将是根结点的左右孩子的值是否相等(即对称),但题目要求的是镜像对称。所以,本题的特殊之处在于,要将整个二叉树抽象成两棵二叉树,对两棵树的结点进行比较。假设为A、B两棵树,其都有自己的左右孩子结点。需要比较A的左孩子和B的右孩子是否相等,A的右孩子和B的左孩子是否相等。所以需要新建一个用来递归的函数,形参为两棵树的root结点,自顶向下地判断。
在这里插入图片描述

三部曲开始:

  1. 递归的出口:什么时候递归结束?有三种情况需要结束:
    (1)A、B都是空结点,则对称;
    (2)A的左孩子为空而B的右孩子不为空或A的右孩子为空而B的左孩子不为空,则不对称;
    (3)A的左孩子值 != B的右孩子值或A的右孩子值 != B的左孩子值,则不对称。
  2. 返回什么信息:返回的就是A和B两棵树是否镜像对称(true或false)。
  3. 本层递归做什么:对AB两棵树进行对称比较。

若思路不对欢迎指正!

解答

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool recu(TreeNode* nLeft, TreeNode* nRight){
        if(nLeft == NULL && nRight == NULL) return true;
        if(nLeft == NULL || nRight == NULL) return false;
        if(nLeft->val != nRight->val) return false;
        return recu(nLeft->left, nRight->right) && recu(nLeft->right, nRight->left);
    }
    bool isSymmetric(TreeNode* root) {
        if(root == NULL) return true;
        return recu(root->left, root->right);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值