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

题目:

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

思路:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值