LintCode 376. Binary Tree Path Sum

博客围绕二叉树路径和问题展开,给定二叉树,需找出节点和等于给定目标值的所有路径,路径需从根节点到叶节点。文中给出示例展示不同输入下的输出情况,还介绍了使用DFS(深度优先搜索)的解法。

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

  1. Binary Tree Path Sum
    中文English
    Given a binary tree, find all paths that sum of the nodes in the path equals to a given number target.

A valid path is from root node to any of the leaf nodes.

Example
Example 1:

Input:
{1,2,4,2,3}
5
Output: [[1, 2, 2],[1, 4]]
Explanation:
The tree is look like this:
1
/
2 4
/
2 3
For sum = 5 , it is obviously 1 + 2 + 2 = 1 + 4 = 5
Example 2:

Input:
{1,2,4,2,3}
3
Output: []
Explanation:
The tree is look like this:
1
/
2 4
/
2 3
Notice we need to find all paths from root node to leaf nodes.
1 + 2 + 2 = 5, 1 + 2 + 3 = 6, 1 + 4 = 5
There is no one satisfying it.

解法1:DFS
代码如下:

/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */


class Solution {
public:
    /*
     * @param root: the root of binary tree
     * @param target: An integer
     * @return: all valid paths
     */
    vector<vector<int>> binaryTreePathSum(TreeNode * root, int target) {
        if (!root) return vv;
        vector<int> v;
        helper(root, target, v);
        return vv;
    }

private:
    vector<vector<int>> vv;
    void helper(TreeNode * root, int target, vector<int> & v) {
        if (!root) return;
        if (target == root->val && !root->left && !root->right) {
            v.push_back(target);
            vv.push_back(v);
            v.pop_back();
            return;
        }
        v.push_back(root->val);
        helper(root->left, target - root->val, v);
        helper(root->right, target - root->val, v);
        v.pop_back();
    }
};
资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 华为移动服务(Huawei Mobile Services,简称 HMS)是一个全面开放的移动服务生态系统,为企业和开发者提供了丰富的工具和 API,助力他们构建、运营和推广应用。其中,HMS Scankit 是华为推出的一款扫描服务 SDK,支持快速集成到安卓应用中,能够提供高效且稳定的二维码和条形码扫描功能,适用于商品扫码、支付验证、信息获取等多种场景。 集成 HMS Scankit SDK 主要包括以下步骤:首先,在项目的 build.gradle 文件中添加 HMS Core 库和 Scankit 依赖;其次,在 AndroidManifest.xml 文件中添加相机访问和互联网访问权限;然后,在应用程序的 onCreate 方法中调用 HmsClient 进行初始化;接着,可以选择自定义扫描界面或使用 Scankit 提供的默认扫描界面;最后,实现 ScanCallback 接口以处理扫描成功和失败的回调。 HMS Scankit 内部集成了开源的 Zxing(Zebra Crossing)库,这是一个功能强大的条码和二维码处理库,提供了解码、生成、解析等多种功能,既可以单独使用,也可以与其他扫描框架结合使用。在 HMS Scankit 中,Zxing 经过优化,以更好地适应华为设备,从而提升扫描性能。 通常,ScanKitDemoGuide 包含了集成 HMS Scankit 的示例代码,涵盖扫描界面的布局、扫描操作的启动和停止以及扫描结果的处理等内容。开发者可以参考这些代码,快速掌握在自己的应用中实现扫码功能的方法。例如,启动扫描的方法如下: 处理扫描结果的回调如下: HMS Scankit 支持所有安卓手机,但在华为设备上能够提供最佳性能和体验,因为它针对华为硬件进行了
<think>这个错误信息表明在尝试创建KDTree时,输入的数据集`pts`是空的(即0个样本)。具体来说,错误发生在`estimate_normals`函数中的`tree = KDTree(pts, leaf_size=2)`这一行。 原因分析: 1. 骨架点提取失败:`skeleton = skeletonize(blobs)`可能没有提取到任何骨架点,导致`centers`数组为空(即`x, y = np.where(skeleton>0)`返回空数组)。 2. 二值化问题:图像二值化可能没有正确分割出裂缝,导致`blobs`全为0,从而`skeletonize`后没有白色像素(即骨架点)。 解决步骤: 1. 检查二值化结果:确保`blobs`中有裂缝区域(值为1),并且裂缝区域足够大以产生骨架。 2. 检查骨架提取:确保`skeleton`中有非零点(即骨架点存在)。 调试建议: 在骨架提取后,添加以下检查代码: ```python if len(x) == 0: print("警告:未提取到骨架点!") # 可以显示二值化图像以检查 plt.imshow(blobs, cmap='gray') plt.show() else: centers = np.hstack((x.reshape(-1,1), y.reshape(-1,1))) ``` 可能的原因及解决方案: - 图像路径错误:确认图像是否成功加载(检查`image`是否为空)。 - 二值化阈值不当:原图可能因光照等因素需要调整阈值(例如,使用大津法自适应阈值)。 - 裂缝区域过小:图像中可能没有裂缝,或裂缝区域太小,导致骨架提取后无点。 示例修正(使用自适应阈值): 将二值化部分改为: ```python from skimage.filters import threshold_otsu thresh = threshold_otsu(image) blobs = image > thresh # 根据情况可能需要反转,因为裂缝通常比背景暗 # 如果裂缝是暗的,背景是亮的,则可能需要:blobs = image < thresh ``` 注意:程序原二值化方法(`blobs[blobs<128]=0; blobs[blobs>128]=1`)可能不适用于所有图像,特别是当裂缝区域灰度值变化较大时。 结论:错误是由于骨架点数组`centers`为空(即没有骨架点)导致后续KDTree无法构建。需要确保图像预处理得到有效的裂缝二值掩膜。</think>### 报错原因分析 出现 `ValueError: Found array with 0 sample(s)` 错误的原因是程序尝试创建 KDTree 时输入的数据集为空。具体分析如下: 1. **问题根源**: ```python centers = np.hstack((x.reshape(-1,1),y.reshape(-1,1))) # ← 此处centers可能为空数组 normals = estimate_normals(centers,3) # ← 将空数组传入函数 ``` 在 `estimate_normals` 函数中: ```python tree = KDTree(pts, leaf_size=2) # ← 当pts为空时触发错误 ``` 2. **根本原因链**: - `skeleton = skeletonize(blobs)` 未检测到任何骨架点 - → `x, y = np.where(skeleton>0)` 返回空数组 - → `centers = np.hstack(...)` 创建了 shape=(0,2) 的空数组 - → 空数组传入 `KDTree` 构造函数导致报错 3. **可能的原因**: - **图像二值化失败**:`blobs[blobs<128]=0` 和 `blobs[blobs>128]=1` 可能导致所有像素被设为0 - **裂缝区域过小**:图像中没有足够的裂缝像素生成骨架 - **路径错误**:`image = io.imread(path+"7Q3A9060-18.png")` 文件未正确加载 - **图像全黑/全白**:输入图像可能不包含有效裂缝区域 --- ### 解决方案 1. **添加空数组检查**(推荐): ```python x, y = np.where(skeleton>0) if len(x) == 0: print("警告:未检测到骨架点!请检查二值化结果") # 可视化二值图像辅助调试 plt.imshow(blobs, cmap='gray') plt.show() exit() # 或跳过后续处理 else: centers = np.hstack((x.reshape(-1,1), y.reshape(-1,1))) ``` 2. **检查图像加载**: ```python print(f"图像尺寸:{image.shape} 像素范围:[{np.min(image)}-{np.max(image)}]") plt.imshow(image, cmap='gray') plt.title("原始图像") plt.show() ``` 3. **改进二值化方法**: ```python # 使用自适应阈值替代固定阈值 from skimage.filters import threshold_otsu thresh = threshold_otsu(image) blobs = image > thresh # 裂缝通常比背景暗,可能需要反转 ``` 4. **验证骨架提取**: ```python # 可视化骨架提取结果 fig, ax = plt.subplots() ax.imshow(skeleton, cmap='gray_r') ax.set_title(f"骨架点数量:{np.sum(skeleton)}") plt.show() ``` --- ### 调试建议 1. 在关键步骤后添加数组形状检查: ```python print("二值图形状:", blobs.shape, "非零像素:", np.count_nonzero(blobs)) print("骨架图形状:", skeleton.shape, "骨架点数:", np.sum(skeleton>0)) ``` 2. 检查文件路径有效性: ```python import os print("文件存在:", os.path.exists(path+"7Q3A9060-18.png")) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值