如何检查整个树是否完全具有0或2个节点?请考虑以下条件:
这是我到目前为止所做的:
public static boolean isLeafOrHasTwoChildren(Node t) {
if (t.left == null && t.right == null) {
return true;
}
if (t.left == null || t.right == null) {
return false;
}
// Recurse down the tree
return isLeafOrHasTwoChildren(t.left)
&& isLeafOrHasTwoChildren(t.right);
}
Size计算树中的节点数。
答案 0 :(得分:-1)
让我们列举一下我们的条件。
让我们确定第一个条件 - isLeaf
- as:
boolean isLeaf = t.left == null && t.right == null;
让我们将hasAllChildren
定义为:
boolean hasAllChildren = !(t.left == null || t.right == null);
如果仔细观察,由于德莫根定律,!(t.left == null || t.right == null)
与t.left == null && t.right != null
相同。这使我们能够相当直接地表达这一点,这可能是你遗失的部分。
现在,让我们讨论递归流程。我们希望以访问左右的方式沿着整个节点链走下去。所以,我们想在递归之前检查一下我们的条件。
基本情况:如果我们不是叶子(暗示我们没有所有孩子),我们立即返回假。
递归步骤:如果我们是一片叶子或我们有所有孩子,我们继续沿着这条链走。
让我们试着表达一下。
public static boolean isLeafOrHasTwoChildren(Node t) {
// Trivial case; if we have an undefined node, we've definitely reached a leaf.
if (t == null) {
return true;
}
boolean isLeaf = t.left == null && t.right == null;
boolean hasAllChildren = !(t.left == null || t.right == null);
if(isLeaf || hasAllChildren) {
return isLeafOrHasTwoChildren(t.left) && isLeafOrHasTwoChildren(t.right);
} else {
return false;
}
}