检查树是否有0或2个孩子

时间:2016-07-29 21:55:51

标签: java tree binary-search-tree

如何检查整个树是否完全具有0或2个节点?请考虑以下条件:

  • 一个有0个孩子的节点是半完美的。
  • 有一个孩子的节点不是半完美的。
  • 如果有一个有2个孩子的节点是半完美的          (较大的孩子的大小< =较小的孩子的大小* 3)

这是我到目前为止所做的:

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计算树中的节点数。

1 个答案:

答案 0 :(得分:-1)

让我们列举一下我们的条件。

  • 如果所有访问过的节点都为空,则返回true。
  • 如果定义了所有访问过的节点,则返回true。
  • 否则你会返回false。

让我们确定第一个条件 - 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;
   }
}