首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【数据结构与算法 经典例题】判断二叉树是否对称

【数据结构与算法 经典例题】判断二叉树是否对称

作者头像
倔强的石头_
发布2024-12-06 19:25:38
发布2024-12-06 19:25:38
1980
举报
文章被收录于专栏:C/C++指南C/C++指南

一、问题描述

给你一个二叉树的根节点 root , 检查它是否轴对称。 原题出自 101. 对称二叉树 - 力扣(LeetCode)

ce5915b407df453a9c23ad43eb9863e5.jpeg
ce5915b407df453a9c23ad43eb9863e5.jpeg

二、解题思路

判断一颗二叉树是否对称的解题思路可以通过比较两个子树是否镜像对称来实现。 具体地说,如果一棵树的左子树与右子树是镜像对称的,那么这棵树就是对称的。这个问题可以通过递归来解决。 解题思路如下:

  • 首先,比较根节点:如果二叉树为空,那么它是对称的(空树是对称的)。如果二叉树只有一个节点(即根节点),那么它也是对称的。
  • 其次,递归地比较左子树和右子树:对于非空树,我们需要递归地比较它的左子树和右子树。具体来说,我们需要先比较左子树和右子树的结构和数据是否相同,然后再交叉比较左子树的左子树和右子树的右子树,以及左子树的右子树和右子树的左子树。
  • 递归终止条件:在递归过程中,如果两个节点都为空,那么它们是对称的。如果只有一个节点为空,或者两个节点的值不相等,那么它们不是对称的。
  • 要注意的是解决这个问题需要两个函数实现:
  • 第一个函数接收一个树的根结点,判断树是否空以及调用子函数;
  • 第二个函数接收两个节点的值进行对比,这两个节点可能是左子树的根和右子树的根,也可能是左子树的右子树和右子树的左子树,或是左子树的左子树和右子树的右子树

三、C语言实现代码

代码语言:javascript
复制
struct TreeNode {
    int val;
    struct TreeNode* left;
    struct TreeNode* right;
    
};
typedef struct TreeNode TNode;

bool _isSymmetric(TNode* root1, TNode* root2)//子树判断函数
{
    if (root1 == NULL && root2 == NULL)
        return true;
    if (root1 == NULL || root2 == NULL)//结构对比
        return false;
    if (root1->val != root2->val)//数据对比
        return false;
    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);//调用子函数
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、问题描述
  • 二、解题思路
  • 三、C语言实现代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档