Easy-题目25:101. Symmetric Tree

本文介绍了一种检查二叉树是否轴对称的方法,通过递归比较左右子树来实现。给出了Java代码实现,并分析了其效率。

题目原文:
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
题目大意:
给一个二叉树,判断它是不是沿中线轴对称的。
题目分析:
(1) 空树是轴对称的。
(2) 轴对称的两棵子树tree1和tree2应满足以下递归条件:
a) 对应值相等;
b) Tree1的右子树和tree2的左子树是轴对称的;
c) Tree1的左子树和tree2的右子树的轴对称的。
源码:(language:java)

public class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root== null) 
            return true;
        return isSymmetric(root.left, root.right);        
    }

    public boolean isSymmetric(TreeNode tree1, TreeNode tree2){
        if(tree1==null && tree2==null)
            return true;
        else if(tree1 == null || tree2 == null || tree1.val != tree2.val)
            return false;
        else
            return isSymmetric(tree1.left, tree2.right) && isSymmetric(tree1.right, tree2.left);
    }
}

成绩:
1ms,beats21.41%,众数1ms,78.59%
Cmershen的碎碎念:
这道题很基础,但当时却没有想到。这种题应该予以重视,以免面试时面对如此简单题却无能为力。

结果差距很大的原因主要在于以下几个方面:GLCM矩阵的归一化、数值精度以及公式的正确实现。下面我将详细分析问题并提供解决方法。 --- ### **MATLAB 代码实现** 以下是调整后的代码,确保内置函数和手动计算的结果尽可能一致: ```matlab % 计算灰度共生矩阵 (GLCM) glcm_x = graycomatrix(img_tumor_scaled, ... 'Offset', [0 1], ... % 水平方向(向右 1 像素) 'Symmetric', true, ... 'NumLevels', 128, ... 'GrayLimits', []); ... glcm_y = graycomatrix(img_tumor_scaled, ... 'Offset', [1 0], ... % 垂直方向(向下 1 像素) 'Symmetric', true, ... 'NumLevels', 128, ... 'GrayLimits', []); % 提取 GLCM 的归一化矩阵 glcm_x_norm = glcm_x(:, :, 1, 1); % 取出归一化的 GLCM 矩阵 glcm_y_norm = glcm_y(:, :, 1, 1); % 内置函数计算纹理特征 stats_x = graycoprops(glcm_x, {'Contrast', 'Energy', 'Homogeneity'}); stats_y = graycoprops(glcm_y, {'Contrast', 'Energy', 'Homogeneity'}); % 手动计算纹理特征 features_x = calculate_texture_features(glcm_x_norm); features_y = calculate_texture_features(glcm_y_norm); % 显示结果 fprintf('内置函数计算纹理特征 (X-Axis):\n'); fprintf('Contrast:%.4f\n', stats_x.Contrast); fprintf('Energy:%.4f\n', stats_x.Energy); fprintf('Homogeneity:%.4f\n', stats_x.Homogeneity); fprintf('手动计算纹理特征 (X-Axis):\n'); fprintf('Contrast:%.4f\n', features_x.contrast); fprintf('Energy:%.4f\n', features_x.energy); fprintf('Homogeneity:%.4f\n', features_x.homogeneity); fprintf('内置函数计算纹理特征 (Y-Axis):\n'); fprintf('Contrast:%.4f\n', stats_y.Contrast); fprintf('Energy:%.4f\n', stats_y.Energy); fprintf('Homogeneity:%.4f\n', stats_y.Homogeneity); fprintf('手动计算纹理特征 (Y-Axis):\n'); fprintf('Contrast:%.4f\n', features_y.contrast); fprintf('Energy:%.4f\n', features_y.energy); fprintf('Homogeneity:%.4f\n', features_y.homogeneity); function features = calculate_texture_features(glcm) % 获取 GLCM 尺寸 [numLevels, ~] = size(glcm); % 初始化特征 energy = 0; contrast = 0; homogeneity = 0; % 遍历 GLCM 计算特征 for i = 1:numLevels for j = 1:numLevels pij = double(glcm(i, j)); % 确保使用双精度浮点数 % 能量 (Energy) energy = energy + pij^2; % 对比度 (Contrast) contrast = contrast + (i - j)^2 * pij; % 同质性 (Homogeneity) homogeneity = homogeneity + pij / (1 + abs(i - j)); end end % 返回特征 features.energy = energy; features.contrast = contrast; features.homogeneity = homogeneity; end ``` --- ### **解释** #### 1. **GLCM 归一化问题** - MATLAB 的 `graycomatrix` 函数生成的 GLCM 是未归一化的整数矩阵。 - 在计算纹理特征时,`graycoprops` 函数会自动对 GLCM 进行归一化处理。 - 手动计算时,必须从 `glcm_x` 和 `glcm_y` 中提取归一化的矩阵(即 `glcm_x(:, :, 1, 1)` 和 `glcm_y(:, :, 1, 1)`)。 #### 2. **数值精度问题** - 手动计算时,如果使用单精度浮点数或整数类型,可能会导致累加过程中出现舍入误差。 - 解决方法:在手动计算中,将所有数值转换为双精度浮点数(`double`)。 #### 3. **公式实现细节** - **对比度**:`contrast = sum((i - j)^2 * pij)`。 - **能量**:`energy = sum(pij^2)`。 - **同质性**:`homogeneity = sum(pij / (1 + abs(i - j)))`。 - 如果公式实现有误(例如索引偏移或边界条件错误),将导致结果不一致。 #### 4. **边界条件** - MATLAB 的 `graycomatrix` 函数在生成 GLCM 时会对边界像素进行特殊处理。 - 手动计算时,需要确保边界条件与 MATLAB 的实现一致。 #### 5. **多方向 GLCM** - 如果 GLCM 包含多个方向,则需要明确选择某个方向的矩阵进行计算。 - 在代码中,我们选择了 `[0 1]` 和 `[1 0]` 方向的 GLCM 矩阵。 --- ### **总结** - 纹理特征提取的结果差异主要来源于 GLCM 是否已归一化、数值精度、公式实现细节以及边界条件。 - 确保 GLCM 已归一化,并使用正确的公式实现,可以显著缩小内置函数和手动计算之间的差距。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值