【牛客刷题-算法】NC9 二叉树中和为某一值的路径(一)

简介: 【牛客刷题-算法】NC9 二叉树中和为某一值的路径(一)

1.题目描述


描述

给定一个二叉树root和一个值 sum ,判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。


该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点

叶子节点是指没有子节点的节点

路径只能从父节点到子节点,不能从子节点到父节点

总节点数目为n

例如:

给出如下的二叉树,s u m = 22 sum=22sum=22,

image.png


返回true,因为存在一条路径 5 → 4 → 11 → 2 5\to 4\to 11\to 25→4→11→2的节点值之和为 22。


数据范围:

1.树上的节点数满足 0 ≤ n ≤ 10000 0 \le n \le 100000≤n≤10000

2.每个节点的值都满足∣ v a l ∣ ≤ 1000 |val| \le 1000∣val∣≤1000

要求:空间复杂度 O ( n ) O ( n ) O(n)O(n)O(n)O(n),时间复杂度O ( n ) O ( n ) O(n)O(n)O(n)O(n)

进阶:空间复杂度 O ( 树的高度 ) O ( 树的高度 ) O(树的高度)O(树的高度)O(树的高度)O(树的高度),时间复杂度 O ( n ) O ( n ) O(n)O(n)O(n)O(n)


2.算法设计思路


核心其实就是一个二叉树的遍历。可以采用回溯法,在遍历树的过程中,利用一个全局变量num记录遍历到当前节点时路径上所有值的和。


当以当前结点为根的子二叉树中没有符合要求的叶子结点时,就向上回溯(从父结点到子结点时,num的值增加了;因此返回时就减去相应的值。)


3.代码实现


注:这里并不是完整代码,而只是核心代码的模式


/**
 * struct TreeNode {
 *  int val;
 *  struct TreeNode *left;
 *  struct TreeNode *right;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param root TreeNode类 
 * @param sum int整型 
 * @return bool布尔型
 */
int num = 0;
bool hasPathSum(struct TreeNode* root, int sum ) {
    // write code here
    bool flag = false;
    if(root == NULL){return false;}
    num += root->val;
    //printf("num:%d\n", num);
    if(num == sum && root->left == NULL && root->right == NULL){return true;}
  //查找左右子树
    if(hasPathSum(root->left, sum) == true){return true;}
    else {flag = true;}
    if(hasPathSum(root->right, sum) == true){return true;}
    else {flag = true;}
  //回溯
    if(flag == true){
        num -= root->val;
        return false;
    }
  //最后不加个返回,就会显示编译错误。其实前面逻辑上是一定会有返回值的
    printf("error\n");
    return false;
}

当没有最后一行代码return false;时,就会显示如下的编译错误,避坑(代码其实应该是没有问题的)。


image.png


4.运行结果


成功通过!

image.png

相关文章
|
2天前
|
存储 缓存 算法
如何提高二叉树遍历算法的效率?
选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
14 5
|
5天前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
12 0
|
26天前
|
数据采集 监控 安全
厂区地图导航制作:GIS技术与路径导航算法融合
在智能化、数字化时代,GIS技术为厂区的运营管理带来了革命性变化。本文探讨了如何利用GIS技术,通过数据采集、地图绘制、路径规划、位置定位和信息查询等功能,打造高效、精准的智能厂区地图导航系统,提升企业的竞争力和管理水平。
35 0
厂区地图导航制作:GIS技术与路径导航算法融合
|
29天前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
17 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
29天前
|
存储 算法 搜索推荐
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
17 0
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
|
27天前
|
数据可视化 搜索推荐 Python
Leecode 刷题笔记之可视化六大排序算法:冒泡、快速、归并、插入、选择、桶排序
这篇文章是关于LeetCode刷题笔记,主要介绍了六大排序算法(冒泡、快速、归并、插入、选择、桶排序)的Python实现及其可视化过程。
12 0
|
29天前
|
存储 算法
数据结构与算法学习十六:树的知识、二叉树、二叉树的遍历(前序、中序、后序、层次)、二叉树的查找(前序、中序、后序、层次)、二叉树的删除
这篇文章主要介绍了树和二叉树的基础知识,包括树的存储方式、二叉树的定义、遍历方法(前序、中序、后序、层次遍历),以及二叉树的查找和删除操作。
22 0
|
17天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
2天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
3天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。