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