C语言算法题之二叉树的路径和

2023-11-20

 思路

二叉树顾名思义就是一个最多有两个子节点的数据结构,如下图所示。

其中像数字7和8,5和6这四个节点都叫做叶子节点,其他的节点都是叫做根节点。 路径有:

  • 1-2-4-7(路径和为1+2+4+7=14)
  • 1-2-4-8(路径和为1+2+4+8=15)
  • 1-2-5(路径和为1+2+5=8)
  • 1-3-6 (路径和为1+3+6=10)

给定一个二叉树和指定值,那么如何便利路径和并比较是否等于指定值呢?可以将路径和看作是一个算式,算式左边等于各路径上的节点之和,算式右边等于指定值。然后通过移相的方式来比较算式两边的值是否相等,比如1-2-4-7这个路径可以分为以下几步:(以下等式用?=表示是否等于,假设指定值就是14)

  1. 2+4+7?=14-1 = 13
  2. 4+7?=13-2=11
  3. 7?=11-4

同理可得其他路径之和是否等于该指定值,编程实现如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
 
/// 声明代表一个二叉树节点的数据结构
typedef struct Node {
    int value;
    struct Node *left;
    struct Node *right;
} Node, *Tree;

/// 创建一个二叉树(前序法)
/// @param T 指向二叉树的指针
/// @param flag 0:代表根节点 -1:代表左节点 1:代表右节点
void CreateBiTree(Tree *T, int flag)
{
    int val;
    flag != 0 ? (flag == -1 ?
                 printf("请输入左节点的值:") :
                 printf("请输入右节点的值:")) :
                printf("请输入根节点的值:");
    scanf("%d",&val);
    //以0作为空节点
    if(val == 0) {
        *T = NULL;
    } else {
        *T = malloc(sizeof(Node));
        if(*T == NULL) exit(-1);
        (*T)->value=val;
        CreateBiTree(&(*T)->left, -1);
        CreateBiTree(&(*T)->right, 1);
    }
}

/// 判断指定二叉树是否至少有一条路径和等于指定值
/// @param T 二叉树
/// @param orderSum 指定值
bool hasPathSameOrderSum(Tree T, int orderSum) {
    if (T == NULL) {
        return false;
    }
    if (T->left == NULL && T->right == NULL && T->value == orderSum) {
        free(T);
        return true;
    }
    
    Tree left = T->left;
    Tree right = T->right;
    int value = T->value;
    free(T);
    return (hasPathSameOrderSum(left, orderSum-value) || hasPathSameOrderSum(right, orderSum-value));
}
 
int main(int argc, const char * argv[]) {
    Tree tree = NULL;
    printf("创建一个二叉树\n");
    CreateBiTree(&tree, 0);
    int sum;
    printf("请输入指定路径和:");
    scanf("%d", &sum);
    if (hasPathSameOrderSum(tree, sum)) {
        printf("该二叉树至少有一条路径和等于%d", sum);
    } else {
        printf("该二叉树任意一条路径和都不等于%d", sum);
    }
    printf("\n");
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言算法题之二叉树的路径和 的相关文章

随机推荐

  • Anchor是什么?

    1 选择性搜索 Selective Search 先介绍一下传统的人脸识别算法 是怎么检测出图片中的人脸的 以下图为例 如果我们要检测图中小女孩的人脸位置 一个比较简单暴力的方法就是滑窗 我们使用不同大小 不同长宽比的候选框在整幅图像上进行
  • crmeb重新安装_手动安装教程 · CRMEB 知识付费版 帮助文档 · 看云

    手动安装 1 创建数据库 倒入数据库文件 数据库文件目录 public install zhishifufei sql 2 修改数据库连接文件 配置文件路径 application database php 数据库类型 type gt my
  • vagrant启动openshift

    1 Install Vagrant 2 Install VirtualBox Ex yum install VirtualBox from the RPM Fusion repository 3 In your bashrc file or
  • 元胞自动机算法汇总含matlab代码_数学建模(十三)

    元胞自动机理论 许多复杂的问题都可以通过元胞自动机来建立模型 元胞自动机实质上是定义在一个具有离散 有限状态的元胞组成的元胞空间上 并按照一定的局部规则 在离散的时间维度上演化的动力学系统 元胞又可称为单元 细胞 是元胞自动机的最基本的组成
  • 【hortonworks/registry】registry 如何添加新的类型 支持 json

    1 概述 hortonworks registry 支持json 但是要自己扩展 有相关接口 支持基本类型 支持自定义对象类型 支持集合类型 map array null 支持嵌套结构 registry支持的数据类型有好几种 其中有Avro
  • STM32F103C8T6+PWM+DMA驱动 WS2812灯带

    STM32 PWM DMA驱动 WS2812灯带 文章目录 1 理论 2代码 理论 1 WS2812参考数据手册 https wenku baidu com view 0925958fba68a98271fe910ef12d2af90342
  • 基于Matlab卡尔曼滤波的IMU和GPS组合导航数据融合(附上源码+数据)

    本文介绍了如何使用Matlab实现惯性测量单元 IMU 和全球定位系统 GPS 组合导航数据融合的卡尔曼滤波算法 通过将IMU和GPS的测量数据进行融合 可以提高导航系统的精度和鲁棒性 我们将详细介绍卡尔曼滤波的原理和实现步骤 并给出源码
  • SpringBoot使用Pio-tl动态填写合同(文档)

    poi tl poi template language 是Word模板引擎 使用Word模板和数据创建很棒的Word文档 poi tl官方网址 项目中有需求需要动态填充交易合同 因此想到了使用poi tl技术来实现 一 引入依赖
  • Keil5无法进入debug(卡死在启动文件)

    Keil5无法进入debug 卡死在启动文件 出现的情况 运行一直卡死在启动文件 例如startup stm32f103xe s 而主程序的箭头也只有一个 两个箭头的运行行在启动文件 debug一直无法运行 解决办法 你在程序中使用了pri
  • Qml与C++交互4:C++信号与Qml的槽函数的连接

    Qml与C 交互4 C 信号与Qml的槽函数的连接 使用场景 整体思路 1 建立C 信号 2 C 实例注册到qml 3 qml中建立槽函数 Connections 类型 建立槽函数 运行结果 使用属性 更多资讯 知识 微信公众号搜索 上官宏
  • OpenCV项目编译错误

    编译遇到如下错误 opencv 3 4 4 modules highgui src window gtk cpp 1062 error 218 No OpenGL support Library was built without Open
  • 长春地铁一号线作业

    长春一号线作业 代码如下 public class 第一次作业 public static void main String args System out println 北环城站 一匡街 胜利公园 解放大路 工农广场 卫星广场 华庆路
  • 卡尔曼及扩展卡尔曼滤波详细推导-来自DR_CAN视频

    卡尔曼及扩展卡尔曼滤波详细推导 来自DR CAN视频 见知乎https zhuanlan zhihu com p 585819291
  • Pytorch权重初始化方法——Kaiming、Xavier

    Pytorch权重初始化方法 Kaiming Xavier 结论 结论写在前 Pytorch线性层采取的默认初始化方式是Kaiming初始化 这是由我国计算机视觉领域专家何恺明提出的 我的探究主要包括 为什么采取Kaiming初始化 考察K
  • window10 设置 cmd 与 PowerShell 格式UTF-8

    win R键 输入 regedit 进入 如果进入不了就去下载 regedit cmd 接下来我们进入对应目录添加对应字符串 好了我们重启vscode运行即可 PowerShell 原CodePage数值数据 更改CodePage数值数据
  • Unity Shader入门精要第七章 基础纹理之遮罩纹理

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一 实践 参考 前言 遮罩纹理 mask texture 是本章要介绍的最后一种纹理 它非常有用 在很多商业游戏中 都可以见到它的身影 那么什么是遮罩呢 简单来讲 遮罩允许我们
  • WIN10 系统,笔记本电脑显示 “未检测到摄像头”

    笔记本电脑无缘无故不能使用摄像头了 在打开腾讯会议的时候显示 未检测到摄像头 检测设备是否连接 打开设备管理器发现没有 照相机 这个选项 并且在狠心下载360卫士进行系统修复后和驱动检测发现不是驱动的问题之后 摄像头仍然无法使用 在尝试多种
  • 如何使用Minio进行对象存储和数据管理

    Minio是一个开源的对象存储服务器 可用于存储和管理各种类型的数据 包括图像 视频 文档等等 本文将介绍如何安装和配置Minio 使用Minio进行对象存储 以及如何利用Minio的高级功能和解决常见问题 一 简介 1 1 什么是Mini
  • 【Linux 应用】网络相关开发---ip、网关、掩码、dns、mac的获取和设置,以及dhcp动态获取

    最近开始调试Linux 的测试版 需要开发网络设置相关功能 其实这一块以前也做过 但是都忘记了 可见沉淀的重要性 1 ip 掩码设置和获取 通过int ioctl int d int request 这个函数可以获取到 其中 IP设置 SI
  • C语言算法题之二叉树的路径和

    思路 二叉树顾名思义就是一个最多有两个子节点的数据结构 如下图所示 其中像数字7和8 5和6这四个节点都叫做叶子节点 其他的节点都是叫做根节点 路径有 1 2 4 7 路径和为1 2 4 7 14 1 2 4 8 路径和为1 2 4 8 1