IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> C语言算法题之二叉树的路径和 -> 正文阅读

[数据结构与算法]C语言算法题之二叉树的路径和

?思路

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

其中像数字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;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-28 15:50:37  更:2022-02-28 15:53:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 16:41:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码