给定一个非循环图,计算每个深度的最小元素之和
不包含任何循环或回路的图被称为非循环图。树是一种非循环图,其中每个节点都与另一个唯一节点相连。非循环图也被称为无环图。
循环图与非循环图的区别 -
Cycle Graph | 的中文翻译为:循环图 |
非循环图 |
---|---|---|
图形形成一个闭环。 |
图表没有形成闭环。 |
|
图表中不包含深度循环 |
图表包含每个深度。 |
示例 1
让我们举一个循环图的例子 −
当闭环存在时,就形成了循环图。

Figure I代表了循环图,不包含深度节点。
Example 2
的翻译为:示例2
让我们以一个非循环图的例子来说明:

树的根节点称为零深度节点。在图 II 中,在零深度处只有一个根,即 2。因此它被认为是最小深度为零的节点。
在第一个深度节点中,我们有3个节点元素,如4、9和1,但最小的元素是4。
在第二个深度节点中,我们再次有3个节点元素,如6、3和1,但最小元素是1。
我们将知道总深度节点是如何得出的,
总深度节点 = Zero_Depth 节点的最小值 + First_Depth 节点的最小值 + Zero_Depth 节点的最小值
总深度节点 = 2 + 4 + 3 = 9。所以,9是非循环图的总最小和。
语法
The following syntax used in the program: struct name_of_structure{ data_type var_name; // data member or field of the structure. }
struct − 该关键字用于表示结构数据类型。
name_of_struct - 我们为结构提供任何名称。
结构是将各种相关变量集中在一个地方的集合。
Queue < pair < datatype, datatype> > queue_of_pair
make_pair()
参数
C++ 中的对队列 -
这是用于组合两种不同数据类型的队列对的通用 STL 模板,队列对位于实用程序头文件下。
Queue_of_pair - 我们为该对指定任何名称。
make_pair() - 用于构造具有两个元素的pair对象。
name_of_queue.push()
参数
name_of_queue - 我们正在命名队列名称。
push() − 这是一个预定义的方法,属于队列头部的一部分,push方法的作用是插入元素或值。
name_of_queue.pop()
参数
name_of_queue − 我们正在给队列命名。
pop() − 这是一个预定义的方法,属于队列头文件,并且使用pop方法是为了删除整个元素或值。
算法
我们将启动程序头文件,即'iostream'、'climits'、'utility'、和'queue'。
< /里>我们正在创建具有整数值“val”的结构“tree_node”来获取节点值。然后我们用给定的数据创建tree_node指针来初始化左子节点和右子节点来存储值。接下来,我们创建一个 tree_node 函数,其中 int x 作为参数传递,并验证它是否等于 'val' 整数,并将左右子节点分配为 null 。
现在我们将定义一个函数 minimum_sum_at_each_depth(),它接受一个整数值作为参数,用于找到每个深度的最小和。使用 if- 语句,它检查树的根值是否为空,如果为空则返回 0。
我们正在创建STL(标准模板库)的队列对,以组合两个值。
我们创建了一个名为q的队列变量,它作为一对进行两个方法,即push()和make_pair()。使用这两个方法,我们插入值并构造了一个对象的两对。
我们正在初始化三个变量,即 'present_depth','present_sum' 和 'totalSum',这些变量将用于进一步找到当前总和以及找到总最小总和。
在初始化变量之后,我们创建一个while循环来检查条件,如果队列对不为空,则节点的计数将从开头开始。接下来,我们使用‘pop()’方法删除一个现有的节点,因为它将移动到树的下一个深度来计算最小和。
现在我们将创建三个 if 语句来返回总和的最小和。
在此之后,我们将开始主要的函数,并借助根指针、左右子节点分别构建输入模式的树形结构,并通过新的‘tree_node’传递节点值。
最后,我们调用‘minimum_sum_at_each_depth(root)’函数并传递参数root来计算每个深度的最小总和。接下来,打印语句“非循环图各深度的总和”并得到结果。
请记住,对队列是一个包含队列元素对的容器。
Example
的中文翻译为:示例
在这个程序中,我们将计算每个深度的所有最小节点的总和。

在图二中,总深度的最小和为15+8+4+1 = 13。
现在我们将把这个数字作为该程序的输入。
#include <iostream> #include <queue> // required for FIFO operation #include <utility> // required for queue pair #include <climits> using namespace std; // create the structure definition for a binary tree node of non-cycle graph struct tree_node { int val; tree_node *left; tree_node *right; tree_node(int x) { val = x; left = NULL; right = NULL; } }; // This function is used to find the minimum sum at each depth int minimum_sum_at_each_depth(tree_node* root) { if (root == NULL) { return 0; } queue<pair<tree_node*, int>> q; // create a queue to store node and depth and include pair to combine two together values. q.push(make_pair(root, 0)); // construct a pair object with two element int present_depth = -1; // present depth int present_sum = 0; // present sum for present depth int totalSum = 0; // Total sum for all depths while (!q.empty()) { pair<tree_node*, int> present = q.front(); // assign queue pair - present q.pop(); // delete an existing element from the beginning if (present.second != present_depth) { // We are moving to a new depth, so update the total sum and reset the present sum present_depth = present.second; totalSum += present_sum; present_sum = INT_MAX; } // Update the present sum with the value of the present node present_sum = min(present_sum, present.first->val); //We are adding left and right children to the queue for updating the new depth. if (present.first->left) { q.push(make_pair(present.first->left, present.second + 1)); } if (present.first->right) { q.push(make_pair(present.first->right, present.second + 1)); } } // We are adding the present sum of last depth to the total sum totalSum += present_sum; return totalSum; } // start the main function int main() { tree_node *root = new tree_node(15); root->left = new tree_node(14); root->left->left = new tree_node(11); root->left->right = new tree_node(4); root->right = new tree_node(8); root->right->left = new tree_node(13); root->right->right = new tree_node(16); root->left->left->left = new tree_node(1); root->left->right->left = new tree_node(6); root->right->right->right = new tree_node(2); root->right->left->right = new tree_node(7); cout << "Total sum at each depth of non cycle graph: " << minimum_sum_at_each_depth(root) << endl; return 0; }
输出
Total sum at each depth of non cycle graph: 28
结论
我们探讨了给定非循环图中每个深度的元素最小和的概念。我们看到箭头运算符连接节点并构建树形结构,利用它计算每个深度的最小和。该应用程序使用非循环图,例如城市规划、网络拓扑、谷歌地图等。
以上是给定一个非循环图,计算每个深度的最小元素之和的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

C语言数据结构:树和图的数据表示与操作树是一个层次结构的数据结构由节点组成,每个节点包含一个数据元素和指向其子节点的指针二叉树是一种特殊类型的树,其中每个节点最多有两个子节点数据表示structTreeNode{intdata;structTreeNode*left;structTreeNode*right;};操作创建树遍历树(先序、中序、后序)搜索树插入节点删除节点图是一个集合的数据结构,其中的元素是顶点,它们通过边连接在一起边可以是带权或无权的数据表示邻

文件操作难题的真相:文件打开失败:权限不足、路径错误、文件被占用。数据写入失败:缓冲区已满、文件不可写、磁盘空间不足。其他常见问题:文件遍历缓慢、文本文件编码不正确、二进制文件读取错误。

C语言函数是代码模块化和程序搭建的基础。它们由声明(函数头)和定义(函数体)组成。C语言默认使用值传递参数,但也可使用地址传递修改外部变量。函数可以有返回值或无返回值,返回值类型必须与声明一致。函数命名应清晰易懂,使用驼峰或下划线命名法。遵循单一职责原则,保持函数简洁性,以提高可维护性和可读性。

C35 的计算本质上是组合数学,代表从 5 个元素中选择 3 个的组合数,其计算公式为 C53 = 5! / (3! * 2!),可通过循环避免直接计算阶乘以提高效率和避免溢出。另外,理解组合的本质和掌握高效的计算方法对于解决概率统计、密码学、算法设计等领域的许多问题至关重要。

C语言函数名定义包括:返回值类型、函数名、参数列表和函数体。函数名应清晰、简洁、统一风格,避免与关键字冲突。函数名具有作用域,可在声明后使用。函数指针允许将函数作为参数传递或赋值。常见错误包括命名冲突、参数类型不匹配和未声明的函数。性能优化重点在函数设计和实现上,而清晰、易读的代码至关重要。

C语言多线程编程指南:创建线程:使用pthread_create()函数,指定线程ID、属性和线程函数。线程同步:通过互斥锁、信号量和条件变量防止数据竞争。实战案例:使用多线程计算斐波那契数,将任务分配给多个线程并同步结果。疑难解答:解决程序崩溃、线程停止响应和性能瓶颈等问题。

C语言函数是可重复利用的代码块,它接收输入,执行操作,返回结果,可将代码模块化提高可复用性,降低复杂度。函数内部机制包含参数传递、函数执行、返回值,整个过程涉及优化如函数内联。编写好的函数遵循单一职责原则、参数数量少、命名规范、错误处理。指针与函数结合能实现更强大的功能,如修改外部变量值。函数指针将函数作为参数传递或存储地址,用于实现动态调用函数。理解函数特性和技巧是编写高效、可维护、易理解的C语言程序的关键。

如何在 C 语言中输出倒数?回答:使用循环语句。步骤:1. 定义变量 n 存储要输出的倒数数字;2. 使用 while 循环持续打印 n 直到 n 小于 1;3. 在循环体内,打印出 n 的值;4. 在循环末尾,将 n 减去 1 以输出下一个更小的倒数。
