给一个二叉树,每个节点都是正或负整数,如何找到一个子树,它所有节点的和最大?
提示:后序遍历,每一个节点保存左右子树的和加上自己的值。额外一个空间存放最大值。
写完后序遍历,面试官可能接着与你讨论,
- 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

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

被折叠的 条评论
为什么被折叠?



