目录
示例
输出
结论
首页 后端开发 C++ 使用C++实现删除所有不在任何路径上且路径和小于k的节点

使用C++实现删除所有不在任何路径上且路径和小于k的节点

Sep 04, 2023 am 10:17 AM
路径 路径和 删除节点

使用C++实现删除所有不在任何路径上且路径和小于k的节点

在这个问题中,我们有一个二叉树,其从根节点到叶节点的路径是完全定义的。从根节点到叶子节点的所有节点之和必须大于或等于k。所以我们需要删除路径中总和小于k的所有节点。这里要记住的重要一点是,一个节点可能是许多路径的一部分,因此只有当所有路径的总和

从根节点到叶节点,我们可以计算总和。当节点的递归调用完成并且控制返回时,我们可以检查左路径和右路径的总和是否

假设我们有 150 K 和一棵这样的树 -

      10
      / \
     20 30
    / \  / \
   5 35 40 45
   / \ / \
  50 55 60 65
  / \    / /
  70 80 90 100
登录后复制

如果我们看到路径 root->left->left 的总和为 10 + 20 + 5,即 25,小于 150,我们需要对其进行修剪并删除 5。之后,让我们评估 10- >30->40。它小于150,所以删除40。现在我们看到另一条路径10->20->35->50,总和115小于150,所以我们删除50。现在我们剩下的路径是

10->20->35->55->70 ;
10->20->35->55->80 ;
10->30->45->60->90 ;
10->30->45->65->100 ;
登录后复制

所有路径的总和大于150,因此我们不需要再修剪。

示例

#include <iostream>
using namespace std;
class Node {
   public:
   int value;
   Node *left, *right;
   Node(int value) {
      this->value = value;
      left = right = NULL;
   }
};
Node* removeNodesWithPathSumLessThanK(Node* root, int k, int& sum) {
   if(root == NULL) return NULL;
   int leftSum, rightSum;
   leftSum = rightSum = sum + root->value;
   root->left = removeNodesWithPathSumLessThanK(root->left, k, leftSum);
   root->right = removeNodesWithPathSumLessThanK(root->right, k, rightSum);
   sum = max(leftSum, rightSum);
   if(sum < k) {
      free(root);
      root = NULL;
   }
   return root;
}
void printInorderTree(Node* root) {
   if(root) {
      printInorderTree(root->left);
      cout << root->value << " ";
      printInorderTree(root->right);
   }
}
int main() {
   int k = 150;
   Node* root = new Node(10);
   root->left = new Node(20);
   root->right = new Node(30);
   root->left->left = new Node(5);
   root->left->right = new Node(35);
   root->right->left = new Node(40);
   root->right->right = new Node(45);
   root->left->right->left = new Node(50);
   root->left->right->right = new Node(55);
   root->right->right->left = new Node(60);
   root->right->right->right = new Node(65);
   root->left->right->right->left = new Node(70);
   root->left->right->right->right = new Node(80);
   root->right->right->left->left = new Node(90);
   root->right->right->right->left = new Node(100);
   int sum = 0;
   cout << "Inorder tree before: ";
   printInorderTree(root);
   root = removeNodesWithPathSumLessThanK(root, k, sum);
   cout << "\nInorder tree after: ";
   printInorderTree(root);
   return 0;
}
登录后复制

输出

Inorder tree before: 5 20 50 35 70 55 80 10 40 30 90 60 45 100 65
Inorder tree after: 20 35 70 55 80 10 30 90 60 45 100 65
登录后复制

我们完全修剪后的树 -

         10
         / \
      20 30
      \   \
      35 45
       \ / \
    55  60 65
    / \  /  /
  70 80 90 100
登录后复制

结论

正如我们所看到的,在初始观察之后,我们可以应用 DFS 并在递归函数从每次调用返回时通过计算该节点的总和来删除节点。总的来说,这是一个简单的观察和方法论问题。

以上是使用C++实现删除所有不在任何路径上且路径和小于k的节点的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

主题背景位于 Windows 11 中的什么位置? 主题背景位于 Windows 11 中的什么位置? Aug 01, 2023 am 09:29 AM

Windows11具有如此多的自定义选项,包括一系列主题和壁纸。虽然这些主题以自己的方式是美学,但一些用户仍然想知道他们在Windows11上的后台位置。本指南将展示访问Windows11主题背景位置的不同方法。什么是Windows11默认主题背景?Windows11默认主题背景是一朵盛开的抽象宝蓝色花朵,背景为天蓝色。这种背景是最受欢迎的背景之一,这要归功于操作系统发布之前的预期。但是,操作系统还附带了一系列其他背景。因此,您可以随时更改Windows11桌面主题背景。主题背景存储在Windo

斜杠和反斜杠在文件路径中的不同使用 斜杠和反斜杠在文件路径中的不同使用 Feb 26, 2024 pm 04:36 PM

文件路径是操作系统中用于识别和定位文件或文件夹的字符串。在文件路径中,常见的有两种符号分隔路径,即正斜杠(/)和反斜杠()。这两个符号在不同的操作系统中有不同的使用方式和含义。正斜杠(/)是Unix和Linux系统中常用的路径分隔符。在这些系统中,文件路径是以根目录(/)为起始点,每个目录之间使用正斜杠进行分隔。例如,路径/home/user/Docume

如何修复错误:在Java中找不到或加载主类 如何修复错误:在Java中找不到或加载主类 Oct 26, 2023 pm 11:17 PM

由于技术错误,无法播放此视频。(错误代码:102006)本指南提供了针对此常见问题的简单修复,并继续您的编码之旅。我们还将讨论Java错误的原因以及将来如何防止它。什么是Java中的“错误:找不到或加载主类”?Java是一种强大的编程语言,使开发人员能够创建广泛的应用程序。然而,它的多功能性和效率伴随着开发过程中可能发生的一系列常见错误。其中一个中断是错误:找不到或加载主类user_jvm_args.txt,当Java虚拟机(JVM)找不到主类来执行程序时会出现这种情况。此错误充当了障碍,甚至在

Win11系统中'我的电脑”路径有何不同?快速查找方法! Win11系统中'我的电脑”路径有何不同?快速查找方法! Mar 29, 2024 pm 12:33 PM

Win11系统中“我的电脑”路径有何不同?快速查找方法!随着Windows系统的不断更新,最新的Windows11系统也带来了一些新的变化和功能。其中一个常见的问题是用户在Win11系统中找不到“我的电脑”的路径,这在之前的Windows系统中通常是很简单的操作。本文将介绍Win11系统中“我的电脑”的路径有何不同,以及快速查找的方法。在Windows1

使用path/filepath.Dir函数获取文件路径的目录部分 使用path/filepath.Dir函数获取文件路径的目录部分 Jul 27, 2023 am 09:06 AM

使用path/filepath.Dir函数获取文件路径的目录部分在我们的日常开发过程中,经常会涉及到文件路径的处理。有时候,我们需要获取文件路径的目录部分,即文件所在文件夹的路径。在Go语言中,可以使用path/filepath包提供的Dir函数来实现这个功能。Dir函数的签名如下:funcDir(pathstring)stringDir函数接收一个字

Linux内核源代码存放路径解析 Linux内核源代码存放路径解析 Mar 14, 2024 am 11:45 AM

Linux内核是一个开源的操作系统内核,其源代码存储在一个专门的代码仓库中。在本文中,我们将详细解析Linux内核源代码的存放路径,并通过具体的代码示例来帮助读者更好地理解。1.Linux内核源代码存放路径Linux内核源代码存储在一个名为linux的Git仓库中,该仓库托管在[https://github.com/torvalds/linux](http

Python 3.x 中如何使用os.path模块获取文件路径的各个部分 Python 3.x 中如何使用os.path模块获取文件路径的各个部分 Jul 30, 2023 pm 02:57 PM

Python3.x中如何使用os.path模块获取文件路径的各个部分在日常的Python编程中,我们经常需要对文件路径进行操作,例如获取路径的文件名、文件目录、扩展名等等。在Python中,可以使用os.path模块来进行这些操作。本文将介绍如何使用os.path模块来获取文件路径的各个部分,以便更好地操作文件。os.path模块提供了一系

如何查找Linux系统中RPM文件的存储路径? 如何查找Linux系统中RPM文件的存储路径? Mar 14, 2024 pm 04:42 PM

在Linux系统中,RPM(RedHatPackageManager)是一种常见的软件包管理工具,用于安装、升级和删除软件包。有时候我们需要找到某个已安装的RPM文件的存储路径,以便进行查找或者其他操作。下面将介绍在Linux系统中如何查找RPM文件的存储路径,同时提供具体的代码示例。首先,我们可以使用rpm命令来查找已安装的RPM包及其存储路径。打开

See all articles