题目:
给一个二叉树,每个结点都是正或负整数,如何找到一个子树,它所有的结点和最大?
思路:
可以用后序遍历,用一个变量来存储每个结点左右子树加上自己的最大值,用另一个变量来存储该最大值对应的结点。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct Node{
int val;
Node *left;
Node *right;
Node(int _val):val(_val),left(NULL),right(NULL){}
};
int GetMaxSumSubTreeCore(Node *root, int & max ,Node *&re)
{
if (root == NULL) return 0;
int curMax = GetMaxSumSubTreeCore(root->left, max, re) + GetMaxSumSubTreeCore(root->right, max, re) + root->val;
if (curMax > max)
{
max = curMax;
re = root;
}
return curMax;
}
Node *GetMaxSumSubTree(Node *root)
{
int max = 0;
Node *re = root;
GetMaxSumSubTreeCore(root, max, re);
cout << max << endl;
return re;
}
int main()
{
Node *n1 = new Node(-1);
Node *n2 = new Node(2);
Node *n3 = new Node(3);
Node *n4 = new Node(-4);
Node *n5 = new Node(5);
Node *n6 = new Node(2);
Node *n7 = new Node(1);
Node *n8 = new Node(12);
Node *n9 = new Node(8);
Node *n10 = new Node(1);
Node *n11 = new Node(3);
Node *n12 = new Node(-5);
Node *n13 = new Node(5);
Node *n14 = new Node(6);
Node *n15 = new Node(-30);
n1->left = n2;
n1->right = n3;
n2->left = n4;
n2->right = n5;
n3->left = n6;
n3->right = n7;
n4->left = n8;
n4->right = n9;
n5->left = n10;
n5->right = n11;
n6->left = n12;
n6->right = n13;
n7->left = n14;
n7->right = n15;
Node *re = GetMaxSumSubTree(n1);
cout << re->val << endl;
return 0;
}
注意:如果要修改结点参数,就需要写成
Node *&re;