【发布时间】:2015-02-23 06:58:02
【问题描述】:
给定一个具有以下属性的二叉树,它的所有叶节点都处于正(+)号,然后符号交替到该路径的根。所以一个节点可以有多个符号,具体取决于路径。
现在我们需要找出每条路径的总和和树的总和。
for ex:
there are 5 paths in the given binary tree.
path 1: 10-2+3-4 = 7
path 2: 19-8+2-3+4 = 14
path 3: 12-11+17-3+4 = 19
path 4: 2-9+1-4 = -10
path 5: 21-9+1-4 = 9
overall sum 39
这里的问题是确定每个节点的符号,该符号由其底层路径中的叶节点控制。
我可以想到一个具有 O(n) 时间复杂度和 O(n) 空间的解决方案,我可以将每个路径保存在从根到底部遍历的向量中,然后从叶节点开始确定每个节点的符号,从而计算总和每条路径。
现在任何人都可以提出任何改进的方法,空间复杂度为 O(1)。 任何递归或迭代方法都将是首选。
我希望我已经清楚地解释了这个问题。不过,如果有任何疑问,我会很快补充更多细节。
编辑:二叉树是这样存储和实现的,而不是在数组中
struct node
{
int data;
struct node* left;
struct node* right;
};
struct node* newNode(int data)
{
struct node* node = (struct node*)
malloc(sizeof(struct node));
node->data = data;
node->left = NULL;
node->right = NULL;
return(node);
}
int main()
{
struct node *root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->left->right = newNode(5);
}
在任何情况下都无法节省存储树所需的空间。请不要去制作树。假设给你一棵树的根节点,树已经建好了。
我说的是运行特定算法来回答问题所需的额外空间。
【问题讨论】:
-
你需要最大化总和吗?无法理解判断非叶节点标志的标准。
-
不,我们不需要最大化总和。标准很简单:叶节点处于正号,然后符号交替到该路径的根。所以一个节点可以有多个符号,具体取决于路径
-
O(1) 是什么意思,你必须至少通过节点一次
-
您能解释一下您打算如何在 O(n) 时间和空间内完成它吗?
-
@sasha:我说的是 O(1) 空间而不是 O(1) 时间 O(1) 空间意味着不使用任何额外空间。我会通过使用路径数组 path[] 将当前根存储到叶路径来做到这一点。以自上而下的方式从根遍历到所有叶子。遍历时,将当前路径中所有节点的数据存储在数组path[]中。当我们到达一个叶子节点时,我们可以停下来。