Считать «палочки» (узлы с одним потомком) в бинарном дереве поиска?

1

Таким образом, я работаю с деревьями двоичного поиска, и один из методов, с которыми я столкнулся, - это метод, называемый stickCt, который в основном рассчитывает количество палочек в дереве и возвращает число. Для того, чтобы быть палкой, он должен иметь нулевой и ненулевой дочерний элемент, чтобы он считался палкой, у меня есть мой код и он соответствует, но я все равно получаю 0 в качестве возвращаемого значения, я не знаю, что не так Я пробовал перемещать вещи вокруг, но ничто, кажется, не помогает, будет очень благодарна. Так как я делаю это рекурсивно, вот код:

// The number of nodes with exactly one non-null child
//driver

public int stickCt () {

    return stickCt(root);
}

private static int stickCt (IntNode T) {
    int num;

    //easiest case
    if (T == null) {
        num = 0;
    }
    //if the left child is null and the right child is not null
    else if (T.getLeft() == null && T.getRight() != null) {
        num = stickCt(T.getRight()) + 1;
    }
    //if right child is null and left side is not null
    else if (T.getRight() == null && T.getLeft() != null) {

        num = stickCt(T.getLeft()) + 1;
    }
    //recursive part
    else {
        num = stickCt(T.getLeft()) + stickCt(T.getRight());

    }
    return num;

}
  • 0
    Рекурсивная логика, которая у вас здесь, выглядит отлично. На каких деревьях вы это тестируете?
  • 0
    Хотя я рад, что ответ ниже помог вам, я обеспокоен тем, что вы на самом деле не определили причину проблемы, с которой столкнулись. Новый код работает? Если да, то можете ли вы попытаться выяснить, почему ваш исходный код этого не сделал, чтобы мы могли увидеть, что было не так?
Теги:
algorithm
data-structures
binary-search-tree

1 ответ

1
Лучший ответ

Проблема в том, что вы должны вернуть сумму подсчета палочек на каждом узле, но вместо этого вы просто возвращаете текущее значение палочек. Вы можете переписать метод таким образом:

private static boolean onlyOneIsNull(IntNode node1, IntNode node2) {
    return (node1 != null && node2 == null)
           || (node1 == null && node2 != null);
}

private static int stickCt(IntNode T) {
    //easiest case
    if(T==null) {
        return 0;
    }
    //evaluating if I'm a stick
    int num = 0;
    if (onlyOneIsNull(T.getLeft(), T.getRight())) {
        num = 1;
    }
    //stickCt already takes care of null nodes, no need to add a null validation for nodes
    //need to return the number of sticks from left node and right node
    return stickCt(T.getLeft()) + stickCt(T.getRight()) + num;
}
  • 0
    Я не думаю, что это работает правильно - это подсчитывает общее количество узлов, а не общее количество «палочек» (узлов только с одним дочерним элементом).
  • 0
    @templatetypedef о, хорошо, не понял это правильно. Обновление это.
Показать ещё 12 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню