我在想每个子树有两种情况:根在独立集中,根不在集中。如何编写递归算法来查找树中独立集的数量?这棵树是 n 元的。
https://en.wikipedia.org/wiki/Independent_set_(graph_theory)
到目前为止,这是我的解决方案,但它不正确。如果当前子树的父节点已经包含在独立集中,则变量 parentIncluded 等于 true,因此当前子树的根不能添加到独立集中。如果 parentIncluded 等于 false,则可以将当前子树的根添加到独立集中。当 parentIncluded 为 false 时,有两种情况。第一种情况:将根添加到集合中。第二种情况:不添加根。
public static int numberOfIndependentSets(Binary root) {
if (root == null) {
return 1;
}
return numberOfIndependentSets(root, false) + 1;
}
private static int numberOfIndependentSets(Binary current, boolean parentIncluded) {
if (current.left == null && current.right == null) {
if (parentIncluded) {
return 0;
} else {
return 1;
}
}
int total = 0;
if (parentIncluded) {
int left = numberOfIndependentSets(current.left, false);
int right = numberOfIndependentSets(current.right, false);
total += (left + 1) * (right + 1) - 1;
} else {
// include current node
int left = numberOfIndependentSets(current.left, true);
int right = numberOfIndependentSets(current.right, true);
total = (left+1) *( right +1);
// not include current node
left = numberOfIndependentSets(current.left, false);
right = numberOfIndependentSets(current.right, false);
total += (left+1) * (right+1) -1;
}
return total;
}