2016搜狐笔试二叉树和最大的子树
问题描述:
给一个二叉树,每个节点都是正或负整数,如何找到一个子树,它所有节点的和最大?
思路:采用自底向上的计算。先计算左右子树总和值,用左右子树的总和加上当前节点值,如果当前总和大于最大值,则更新最大值,同时将最大子树根节点更新为当前根。简单说,就是后序遍历。
代码:
- #include <iostream>
- #include <limits>
- using namespace std;
- struct Node
- {
- long data;
- Node *left;
- Node *right;
- };
- // 由于要更新最大值和最大子树根,因此采用了引用参数
- // 也可以考虑使用全局变量来处理
- long Max_sub_tree(Node *root , long &max_sum , Node *& sub_root)
- {
- if(NULL == root)
- {
- sub_root = root;
- return 0;
- }
- // 采用后续遍历
- long left_sum = Max_sub_tree(root->left , max_sum , sub_root); //左子树的总和(计算总和过程中可能已经更新了当前的最大值和子树)
- long right_sum = Max_sub_tree(root->right , max_sum , sub_root); //再计算右子树
- long sum = root->data + left_sum + right_sum;
- if(sum >= max_sum)
- {
- max_sum = sum;
- sub_root = root;
- }
- return sum;
- }
- int main()
- {
- Node p = {1,NULL,NULL};
- Node q = {-3,NULL,NULL};
- Node lr = {2 , &p , &q};
- Node rr = {1 , &q , &p};
- Node r = {5 , &lr , &rr};
- Node *re = NULL;
- long max_sum = numeric_limits<long>::min();
- long sum = Max_sub_tree(&r , max_sum , re);
- if(NULL == re)
- {
- cout<<"empty tree!!!";
- }
- else
- {
- cout<<"max sum is :"<<max_sum<<endl;
- }
- return 0;
- }
“过一个平凡无趣的人生实在太容易了,你可以不读书,不冒险,不运动,不写作,不外出,不折腾……但是,人生最后悔的事情就是:我本可以。”——陈素封。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人