Symmetric Tree - Leetcode

本文介绍了一种检查二叉树是否为中心对称的方法,提供了递归和迭代两种实现方式,并通过示例展示了如何判断一棵二叉树是否为其自身的镜像。

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root == null)
           return true;
        return isSymmetricHelper(root.left, root.right);   
    }
    private boolean isSymmetricHelper(TreeNode left, TreeNode right){
        if(right == null && left == null)
           return true;
        if(right == null || left == null)
           return false;
        return right.val == left.val && isSymmetricHelper(left.left, right.right) && isSymmetricHelper(left.right, right.left);   
    }
}

迭代版本:

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root == null)
           return true;
        Stack<TreeNode> s = new Stack<>();
        s.push(root.left);
        s.push(root.right);
        
        while(!s.empty()){
            TreeNode nd1 = s.pop();
            TreeNode nd2 = s.pop();
            if(nd1==null && nd2==null)
               continue;
            if(nd1==null || nd2==null)
               return false;
            if(nd1.val!=nd2.val)
               return false;
            
            s.push(nd1.left); s.push(nd2.right);
            s.push(nd1.right); s.push(nd2.left);
        }
        return true;
    }
}

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree is symmetric:

    1
   / \
  2   2
 / \ / \
3  4 4  3

But the following is not:

    1
   / \
  2   2
   \   \
   3    3

Note:
Bonus points if you could solve it both recursively and iteratively.


下载前可以先看下教程 https://pan.quark.cn/s/a426667488ae 标题“仿淘宝jquery图片左右切换带数字”揭示了这是一个关于运用jQuery技术完成的图片轮播机制,其特色在于具备淘宝在线平台普遍存在的图片切换表现,并且在整个切换环节中会展示当前图片的序列号。 此类功能一般应用于电子商务平台的产品呈现环节,使用户可以便捷地查看多张商品的照片。 说明中的“NULL”表示未提供进一步的信息,但我们可以借助标题来揣摩若干核心的技术要点。 在构建此类功能时,开发者通常会借助以下技术手段:1. **jQuery库**:jQuery是一个应用广泛的JavaScript框架,它简化了HTML文档的遍历、事件管理、动画效果以及Ajax通信。 在此项目中,jQuery将负责处理用户的点击动作(实现左右切换),并且制造流畅的过渡效果。 2. **图片轮播扩展工具**:开发者或许会采用现成的jQuery扩展,例如Slick、Bootstrap Carousel或个性化的轮播函数,以达成图片切换的功能。 这些扩展能够辅助迅速构建功能完善的轮播模块。 3. **即时数字呈现**:展示当前图片的序列号,这需要通过JavaScript或jQuery来追踪并调整。 每当图片切换时,相应的数字也会同步更新。 4. **CSS美化**:为了达成淘宝图片切换的视觉效果,可能需要设计特定的CSS样式,涵盖图片的排列方式、过渡效果、点状指示器等。 CSS3的动画和过渡特性(如`transition`和`animation`)在此过程中扮演关键角色。 5. **事件监测**:运用jQuery的`.on()`方法来监测用户的操作,比如点击左右控制按钮或自动按时间间隔切换。 根据用户的交互,触发相应的函数来执行...
垃圾实例分割数据集 一、基础信息 • 数据集名称:垃圾实例分割数据集 • 图片数量: 训练集:7,000张图片 验证集:426张图片 测试集:644张图片 • 训练集:7,000张图片 • 验证集:426张图片 • 测试集:644张图片 • 分类类别: 垃圾(Sampah) • 垃圾(Sampah) • 标注格式:YOLO格式,包含实例分割的多边形点坐标,适用于实例分割任务。 • 数据格式:图片文件 二、适用场景 • 智能垃圾检测系统开发:数据集支持实例分割任务,帮助构建能够自动识别和分割图像中垃圾区域的AI模型,适用于智能清洁机器人、自动垃圾桶等应用。 • 环境监控与管理:集成到监控系统中,用于实时检测公共区域的垃圾堆积,辅助环境清洁和治理决策。 • 计算机视觉研究:支持实例分割算法的研究和优化,特别是在垃圾识别领域,促进AI在环保方面的创新。 • 教育与实践:可用于高校或培训机构的AI课程,作为实例分割技术的实践数据集,帮助学生理解计算机视觉应用。 三、数据集优势 • 精确的实例分割标注:每个垃圾实例都使用详细的多边形点进行标注,确保分割边界准确,提升模型训练效果。 • 数据多样性:包含多种垃圾物品实例,覆盖不同场景,增强模型的泛化能力和鲁棒性。 • 格式兼容性强:YOLO标注格式易于与主流深度学习框架集成,如YOLO系列、PyTorch等,方便研究人员和开发者使用。 • 实际应用价值:直接针对现实世界的垃圾管理需求,为自动化环保解决方案提供可靠数据支持,具有重要的社会意义。
<think>嗯,我现在要分析这段判断二叉树是否对称的代码。首先,用户给出的代码是作者灵茶山艾府的解法,用C语言写的。我需要理解这段代码是如何工作的,然后按照用户的要求添加注释,简化复杂的部分,并用更清晰的结构实现相同的功能。 首先看isSameTree函数。通常,判断两棵树是否相同的函数会比较左右子树的结构和值是否一致。但这里可能有个改动,因为题目是判断对称树,所以原来的isSameTree可能被修改成比较镜像对称的结构。比如,原题100题是比较左右子树是否相同,而这里可能将左子树的左节点和右子树的右节点比较,这样就能形成对称的判断。 仔细看一下代码,isSameTree的参数是p和q。在递归调用的时候,传入的是p->left和q->right,以及p->right和q->left。这说明作者实际上是在比较两棵树是否是彼此的镜像。也就是说,p的左子树和q的右子树是否对称,p的右子树和q的左子树是否对称。这样,当传入根节点的左右子树时,整个树就被对称地比较了。 接下来,isSymmetric函数调用了isSameTree,传入root的左右子树。如果这两棵子树是镜像对称的,那么整个树就是对称的。 那问题来了,原题100的isSameTree函数原本是比较两棵树是否完全相同,这里被修改为比较镜像对称的结构。因此,这个isSameTree函数的作用已经变成了判断两棵树是否互为镜像,而不是完全相同。可能函数名容易让人误解,所以可能需要重命名这个函数,比如改成isMirror,这样更清晰。 现在,我需要给这段代码添加注释,解释每个步骤的作用。比如在递归的时候,判断当前节点是否为空,如果有一个为空,另一个也必须为空才能返回true。否则,比较当前节点的值,然后递归比较左子树的左和右子树的右,以及左子树的右和右子树的左。 另外,用户提到要简化复杂的代码结构。原代码中的return语句可能有点复杂,可以拆分成几个步骤,比如先判断当前节点值是否相等,再递归判断左右子树是否对称。这样代码更易读。 可能的简化步骤: 1. 将isSameTree改名为isMirror,以明确其功能。 2. 拆分return语句中的逻辑,使其更易读。 3. 添加注释,说明每个条件判断和递归调用的目的。 例如,原代码中的return p->val == q->val && isSameTree(p->left, q->right) && isSameTree(p->right, q->left); 可以拆分成: if (p->val != q->val) return false; return isMirror(p->left, q->right) && isMirror(p->right, q->left); 这样逻辑更清晰,方便添加注释。 另外,处理根节点为空的情况。原代码中的isSymmetric函数直接调用root->left和root->right,但如果root本身为空,会导致访问空指针的错误。因此,应该在isSymmetric中先判断root是否为空,如果为空的话,返回true,因为空树是对称的。或者,如果root为空,检查左右子树是否都为空。比如: if (root == NULL) return true; return isMirror(root->left, root->right); 这样处理更安全。 原作者的代码可能假设root非空?例如,如果root是空的话,root->left和root->right会导致错误。所以需要补充这个判断。 综上,修改后的代码应该: - 重命名函数为isMirror - 添加root为空的处理 - 拆分复杂的return语句,添加注释</think>以下是代码的详细分析和优化版本,添加了必要注释并简化了结构: ```c /* 判断两棵树是否互为镜像 */ bool isMirror(struct TreeNode* leftTree, struct TreeNode* rightTree) { // 情况1:两者均为空节点 → 对称 if (leftTree == NULL && rightTree == NULL) { return true; } // 情况2:其中一个为空 → 不对称 if (leftTree == NULL || rightTree == NULL) { return false; } // 情况3:节点值不同 → 不对称 if (leftTree->val != rightTree->val) { return false; } // 递归判断镜像:左树的左子树与右树的右子树 && 左树的右子树与右树的左子树 return isMirror(leftTree->left, rightTree->right) && isMirror(leftTree->right, rightTree->left); } bool isSymmetric(struct TreeNode* root) { // 处理空树情况(空树视为对称) if (root == NULL) { return true; } // 只需检查根节点的左右子树是否互为镜像 return isMirror(root->left, root->right); } ``` ### 代码分析: #### 1. 核心函数 `isMirror` - **功能**:判断两棵树是否互为镜像 - **终止条件**: - 当两棵树都为空时:对称(返回 `true`) - 当仅一棵树为空时:不对称(返回 `false`) - **递归逻辑**: - 比较当前节点值是否相等 - 递归检查左树的左子树与右树的右子树是否对称 - 递归检查左树的右子树与右树的左子树是否对称 #### 2. 主函数 `isSymmetric` - **边界处理**:若树为空(`root == NULL`),直接返回 `true` - **核心逻辑**:调用 `isMirror` 检查根节点的左右子树是否互为镜像 ### 优化说明: 1. **函数重命名**:将原 `isSameTree` 更名为 **`isMirror`**,更准确描述功能 2. **结构拆分**:将原代码中的复合条件判断拆分为多步,提升可读性 3. **空指针保护**:主函数中添加 `root == NULL` 判断,避免空指针异常 4. **注释增强**:明确标注每种情况的处理逻辑 ### 复杂度分析: - **时间复杂度**:$O(n)$,每个节点仅访问一次 - **空间复杂度**:$O(h)$,递归栈深度与树高 $h$ 相关,最坏情况(斜树)为 $O(n)$
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值