我有二叉树
2
/ \
3 4
/ \ \
5 1 8
/ \ / \
1 6 9 2
\
4
我想在给定的树中找到maximum possible triangular chord info sum
个节点(在任意两个叶子和一个包含左右子节点的节点之间)。
三角弦将是
表示三角弦:
想象一下任意两片叶子之间的一条线,向上朝向根,找到一个共同的父母(可以是父母,祖父母,祖父母甚至根本身)。向上移动时,对于每片叶子(对于任何叶子,我们必须向上左上方......左右......或者右或右右......等等)意味着(左叶只会移动{{1} }仅向上和向右的叶子只向上移动right
.....所以对于任何一片叶子,left
)..现在我们得到一个三角形的形状......其中we can not move in both direction while moving upwards
。现在,如果a side may contain any no. of nodes/links possible
。三角形的形状将是一个三角形的弦。
请记住triangular shape does not contain any extra internal branches
(如果二叉树没有任何三角形的和弦,则只是创建默认情况)
现在
every leaf node is also always a triangular chord
我们需要 maximum triangular chord will be that triangular chord
which have maximum total in sum of all its node info.
return that maximum total.
例如
If we do not have triangular shaped chord..
then we have to return the leaf with maximum info.
是一个三角形和弦
8
/ \
2 3
\
3
只有单个节点4的子树将是最大三角形和弦(因为它的总和大于另一个具有单个节点1的三角形和弦)不是整个树将是三角形和弦
8
/ \
2 3
\ \
4 1
是一个三角形和弦
所以第一行问题的第一棵树的解决方案是
8
/ \
2 3
/ \
4 3
我严重陷入了这个问题。
我有一个粗略的方法
我将递归调用leftchild作为子树的根,并找到左边的最大三角弦和 然后同样为右子根作为子树。
添加leftmax和rightmax的最大值,并添加到rood节点并返回
在c ++中mycode是:
8+9+2+4 = 23
编辑:我的另一种递归方法
int maxtri(node* n)
{
if(n)
{
lsum = maxtri(n->left);
rsum = maxtri(n->right);
k = maxof(lsum,rsum);
return (n->info + k);
}
}
我对我的方法有疑问。
任何人都可以提供另一种解决方案。??
答案 0 :(得分:1)
这个逻辑怎么样:
对于每个节点遍历左侧部分和右侧部分,如果找到任何分支,则在计算中不考虑此节点,否则请考虑这一点。而且,对于计算节点的部分应该留下&右节点或它应该是叶节点。
注意:我没有正确测试它,但我相信它应该有用。
// Node by Node traverse the tree
void addSum(Node *head, vector<int>& sum)
{
if (head == NULL)
return;
else {
int s = traverseThisNode(head);
sum.push_back(s); // Add to vector
addSum(head->left, sum);
addSum(head->right, sum);
}
}
// For each node traverse left & right
int traverseThisNode(Node *head)
{
if (head && head->left && head->right) {
Node *temp = head; // To traverse right portion of this node
int sum = head->value;
while(head->left) { // Traverse right
head = head->left;
sum = sum + head->value;
if (head->right) { // Condition to check if there is any branching
sum = 0;
break;
}
}
while(temp->right && sum != 0) { // Traverse Right now
temp = temp->right;
sum = sum + temp->value;
if (temp->left) { // Condition to check if there is any branching
sum = 0;
break;
}
}
return sum;
} else if (head && !head->left && !head->right) {
return head->value; // To add leaf node
}
return 0;
}
Now you have vector containing all the value of triangular in the tree, traverse it and
find the maximum.
int maximum()
{
// Traverse the vector "sum" & find the maximum
}
答案 1 :(得分:0)
就我的理解而言,我为我的方法编写了伪代码。
Max = min_value; //possibly 0 if no negative value is allowed for nodes.
sum = 0;
for each node in the tree
temp = node;
sum+= temp->data //collects data at the current level, the current level may be leaf too.
Until temp->left is not null, // Traversing uni-directionally to the left most deep and collecting data.
temp = temp->left
sum+=temp->data
Until temp->right is not null, // Traversing uni-directionally to the right most deep and collecting data.
temp = temp->right
sum+= temp->data
if(sum > Max)
Max = sum;
sum = 0;
print Max;