给一个二叉树,每个节点都是正或负整数,如何找到一个子树,它所有节点的和最大?
2017-01-14 14:37
561 查看
给一个二叉树,每个节点都是正或负整数,如何找到一个子树,它所有节点的和最大?
提示:后序遍历,每一个节点保存左右子树的和加上自己的值。额外一个空间存放最大值。
写完后序遍历,面试官可能接着与你讨论,
a). 如果要求找出只含正数的最大子树,程序该如何修改来实现?
b). 假设我们将子树定义为它和它的部分后代,那该如何解决?
c). 对于b,加上正数的限制,方案又该如何?
总之,一道看似简单的面试题,可能能变换成各种花样。
比如,面试管可能还会再提两个要求:第一,不能用全局变量;第二,有个参数控制是否要只含正数的子树。
a). 如果要求找出只含正数的最大子树,程序该如何修改来实现?
b). 假设我们将子树定义为它和它的部分后代,那该如何解决?
c). 对于b,加上正数的限制,方案又该如何?
提示:后序遍历,每一个节点保存左右子树的和加上自己的值。额外一个空间存放最大值。
写完后序遍历,面试官可能接着与你讨论,
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; }
相关文章推荐
- 给一个二叉树,每个节点都是正或负整数,如何找到一个子树,它所有节点的和最大?
- 有一个二叉树, 节点全部为整数,如何找到一个子树,它所有节点的和最大?要求编程序实现。
- 2个二叉树A、B,树的每个节点上都有一个整数值。如何判断A与B是否其中一个是另一个的子树?
- 写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。
- [阿里巴巴2015校园招聘]写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。 .
- 写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。
- 写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。
- 写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。
- 二叉树的每个节点为0-9的一个数字,根到叶子的一条路径拼成一个数,求所有路径形成的数字和
- 求二叉树中结点的最大值(所有结点的值都是正整数)
- 一个M*N的矩阵,元素取值1或0,问如何找到最大的正方形,其所有的元素都为1
- 如何在二叉树中找到一个节点的后继节点
- 把二叉搜索树变成一个二叉树,使得原来每个节点的值 变成 (原来的值+所有大于它的值的和)
- 题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶结点所经过的结点形成一条路径。
- 给定一个二叉树,找到最大路径和。该路径可以在树中的任何节点处开始和结束。
- 题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个 子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为 O(n)。
- 写一个函数,输入一个二叉树,树中每一个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。
- 今天大家做的一个比赛题:有6个文件,每个文件里大约200w整数,每行一个找出所有文件里最大的一个数字
- 输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个 子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
- 一个M*N的矩阵,元素取值1或0,问如何找到最大的正方形,其所有的元素都为1