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

本文探讨了一道面试题:给定一个二叉树,每个节点包含正或负整数,如何找到和最大的子树。通过后序遍历,每个节点保存其子树的和加上自身值,并在遍历过程中更新最大子树和。面试官可能提出额外条件,如仅考虑正数子树、子树包含部分后代等,引发深入讨论和解决方案的优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

提示:后序遍历,每一个节点保存左右子树的和加上自己的值。额外一个空间存放最大值。

写完后序遍历,面试官可能接着与你讨论,

  • a). 如果要求找出只含正数的最大子树,程序该如何修改来实现?
  • b). 假设我们将子树定义为它和它的部分后代,那该如何解决?
  • c). 对于b,加上正数的限制,方案又该如何?

总之,一道看似简单的面试题,可能能变换成各种花样。

比如,面试管可能还会再提两个要求:第一,不能用全局变量;第二,有个参数控制是否要只含正数的子树。

int findMaxSumNode(TNode* root, TNode*& maxNode, int& maxValue) {
	if (!root) {
		return 0;
	}
	int leftMax = 0;
	int rightMax = 0;
	if (root->left) {
		leftMax = findMaxSumNode(root->left, maxNode, maxValue);
	}
	if (root->right) {
		rightMax = findMaxSumNode(root->right, maxNode, maxValue);
	}
	//暂理解为子树是一个节点包含左右子树(当存在时)
//	leftMax = leftMax > 0 ? leftMax : 0;
//	rightMax = rightMax > 0 ? rightMax : 0;
	if (root->data + leftMax + rightMax > maxValue) {
		maxValue = root->data + leftMax + rightMax;
		maxNode = ro
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值