面试题84:结点和最大的子树

来源:互联网 发布:js 图片对象 编辑:程序博客网 时间:2024/04/30 23:03

题目:

给一个二叉树,每个结点都是正或负整数,如何找到一个子树,它所有的结点和最大?

思路:

可以用后序遍历,用一个变量来存储每个结点左右子树加上自己的最大值,用另一个变量来存储该最大值对应的结点。

#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;

0 0
原创粉丝点击