您的位置:首页 > 其它

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

2017-01-14 14:37 561 查看
给一个二叉树,每个节点都是正或负整数,如何找到一个子树,它所有节点的和最大?

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

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

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 = root;
}

return leftMax + rightMax + root->data;
}


a). 如果要求找出只含正数的最大子树,程序该如何修改来实现?

int findMaxSumNode(TNode* root, TNode &maxSumNode, int &maxSum) {
if (!root) {
return 0;
}

int leftMax = 0;
int rightMax = 0;
if (root->left) {
leftMax = findMaxSumNode(root->left, maxSumNode, maxSum);
}
if (root->right) {
rightMax = findMaxSumNode(root->right, maxSumNode, maxSum);
}

if (root->data <= 0) {
return root->data;
}

leftMax = leftMax > 0 ? leftMax : 0;
rightMax = rightMax > 0 ? rightMax : 0;
int sum = root->data + leftMax + rightMax;

if (sum > maxSum) {
maxSum = sum;
maxSumNode = *root;
}
return sum;
}


b). 假设我们将子树定义为它和它的部分后代,那该如何解决?

int findMaxSumNode(TNode* root, TNode &maxNode, int &maxSum) {
if (!root) {
return 0;
}

int leftMax = 0;
int rightMax = 0;
if (root->left) {
leftMax = findMaxSumNode(root->left, maxNode, maxSum);
}
if (root->right) {
rightMax = findMaxSumNode(root->right, maxNode, maxSum);
}

int leftValue = leftMax > 0 ? leftMax : 0;
int rightValue = rightMax > 0 ? rightMax : 0;
int posChildSum = leftValue + rightValue;	//所有正数子结点和

if (maxSum < posChildSum + root->data) {
maxSum = posChildSum + root->data;
maxNode = *root;
}

if (root->data > 0) {
posChildSum += root->data;
}

return posChildSum;
}


c). 对于b,加上正数的限制,方案又该如何?

int findMaxSumNode(TNode* root, TNode &maxNode, int &maxSum) {
if (!root) {
return 0;
}

int leftMax = 0;
int rightMax = 0;
if (root->left) {
leftMax = findMaxSumNode(root->left, maxNode, maxSum);
}
if (root->right) {
rightMax = findMaxSumNode(root->right, maxNode, maxSum);
}

int leftValue = leftMax > 0 ? leftMax : 0;
int rightValue = rightMax > 0 ? rightMax : 0;
int posChildSum = leftValue + rightValue;	//所有正数子结点和

if (root->data > 0 && maxSum < posChildSum + root->data) {
maxSum = posChildSum + root->data;
maxNode = *root;
}

if (root->data > 0) {
posChildSum += root->data;
}

return posChildSum;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐