我有一棵树,只包含二进制数作为节点数据。现在我必须找到路径的最大长度,该路径只包含节点值为1且路径必须连续的节点,即路径中不应包含任何零。
例如,让我们考虑一下这个树:
root->data = 0;
root->left->data = 1;
root->right->data = 0;
root->left->left->data = 1;
root->left->right->data = 1;
root->left->left->left->data = 1;
root->left->right->left->data = 1;
root->left->right->right->data = 0;
上面树的答案应该是5。 请参考下面给出的链接中的图:
我该怎么做?
答案 0 :(得分:1)
基本理念:
int GetDepthWithCondition(Node node)
{
if (node.Data == 0)
return -100000;
return 1 + Math.Max(GetDepthWithCondition(node.RightSon),
GetDepthWithCondition(node.LeftSon));
}
答案 1 :(得分:1)
你的例子很奇怪。当你的根有0时,我不知道答案是5,它应该是0.另外,它应该只有4,因为如果根是1,最长的路径是沿着整个左侧。
无论如何,这基本上是在强制值为1时找到树的高度。这是diameter of a binary tree的变体,可以通过修改基本解决方案来实现:
public int MaxDiameterWithOnes(Node node)
{
if (node == null || node.Data == 0)
return 0;
return 1 + Math.Max(MaxDiameterWithOnes(node.Left), MaxDiameterWithOnes(node.Right));
}
您可以使用上面链接中的第二种方法对其进行修改,以提高效率。
答案 2 :(得分:0)
算法可以是以下(伪代码):
maxPath tree | treeHasNoChildren = []
| data == 0 = []
| otherwise =
takeSolutionHavingMaxLength (
left:maxPath (left tree),
right:maxPath (right tree)
)