Каково определение для высоты дерева?

Я, может казаться, не нахожу категорический ответ для этого, я пытаюсь сделать некоторые элементарные доказательства на "куче", но здесь - то, что отбрасывает меня немного:

Действительно ли пустым является допустимое дерево? Если так, какова его высота?
Я думал бы, что это будет 0.

Какова высота дерева с единственным узлом?
Я думал бы, что это будет 1, но я видел определения, где это 0 (и если это верно затем я не знаю, как объяснить пустое дерево).

17
задан Brad 5 February 2010 в 20:39
поделиться

6 ответов

Думаю, вам стоит взглянуть на Словарь алгоритмов и структур данных на веб-сайте NIST. Там определение высоты говорит, что единственный узел имеет высоту 0.

Определение действительного дерева действительно включает пустую структуру. На сайте не упоминается высота такого дерева, но, исходя из определения высоты, она также должна быть 0.

9
ответ дан 30 November 2019 в 12:19
поделиться

Высота дерева - это длина пути от корня этого дерева до его самого дальнего узла (т. Е. Листового узла, наиболее удаленного от корня).

Дерево с единственным корневым узлом имеет высоту 0, а дерево с нулевым узлом считается пустым. Пустое дерево имеет высоту -1. Проверьте здесь .

Надеюсь, это поможет.

18
ответ дан 30 November 2019 в 12:19
поделиться

Попробуйте загрузить документ таким образом.

XmlDocument doc = new XmlDocument();
    doc.PreserveWhitespace = true;
    doc.Load("book.xml");
-121--4407449-

Я видел, как он использовался обоими способами (считая один узел равным 0 или 1), но большинство источников определяло бы дерево только корня как дерево высотой 0 и не считало бы дерево с 0 узлами допустимым.

-121--2320264-

Согласно Википедии высота (суб-) дерева с одним единственным узлом равна 0. Высота дерева без узлов будет равна -1. Но я думаю, что это зависит от вас, как вы определяете высоту и ваши доказательства должны работать с любым определением.

0
ответ дан 30 November 2019 в 12:19
поделиться

Я видел, что он используется в обоих вариантах (считая один узел 0 или 1), но большинство источников определили бы дерево только с корнем как дерево высотой 0, и не считали бы дерево с 0 узлами действительным.

5
ответ дан 30 November 2019 в 12:19
поделиться

Высота дерева - это длина самого длинного пути к терминальному узлу в любом из его дочерних узлов.

Википедия утверждает, что высота пустого дерева равна -1. Я не согласен. Пустое дерево - это буквально просто дерево, содержащее один терминальный узел (нулевое или специальное значение, которое представляет пустое дерево). Поскольку у узла нет детей, длина его самого длинного пути должна быть равна пустой сумме = 0, а не -1.

Аналогично, непустое дерево имеет двух детей, поэтому по определению существует по крайней мере путь >= 1 до конечного узла.

Мы можем определить наше дерево следующим образом:

type 'a tree =
    | Node of 'a tree * 'a * 'a tree
    | Nil

let rec height = function
    | Node(left, x, right) -> 1 + max (height left) (height right)
    | Nil -> 0
2
ответ дан 30 November 2019 в 12:19
поделиться

Эта формула определяет, перекрывает ли какой-либо из указанных элементов целевой элемент:

function findIntersectors(targetSelector, intersectorsSelector) {
    var intersectors = [];

    var $target = $(targetSelector);
    var tAxis = $target.offset();
    var t_x = [tAxis.left, tAxis.left + $target.outerWidth()];
    var t_y = [tAxis.top, tAxis.top + $target.outerHeight()];

    $(intersectorsSelector).each(function() {
          var $this = $(this);
          var thisPos = $this.offset();
          var i_x = [thisPos.left, thisPos.left + $this.outerWidth()]
          var i_y = [thisPos.top, thisPos.top + $this.outerHeight()];

          if ( t_x[0] < i_x[1] && t_x[1] > i_x[0] &&
               t_y[0] < i_y[1] && t_y[1] > i_y[0]) {
              intersectors.push($this);
          }

    });
    return intersectors;
}

Вот POC.

Этот вопрос SO был очень полезен в решении этой проблемы.

-121--3815457-

Здесь я вижу две «проблемы». Во-первых, это использование while (true). Я не думаю, что это хорошая практика (хотя, вероятно, это вопрос вкуса для многих людей). Разрыв внутри цикла, однако, интересен для поиска:

for(i = 0; i < MAX; ++i) {
  if ( v[ i ] == searchedElement ) {
      break;
  }
}

Это не является объяснением: вы работаете до конца вектора, хотя если элемент найден, вы ломаетесь, прежде чем достичь его. Это оправданно.

О получении информации с консоли, вы можете столкнуться с большим количеством проблем при чтении непосредственно из cin, например, возвращая содержимое только до первого космоса, если вход имеет один. getline () - служебная функция, считывающая последовательность, которая (почти) всегда безопасна. getline () определяется в заголовке утилиты. Также требуется заголовок последовательности. И cstdio, если вы хотите использовать EOF.

int main()
{
    int ch;
    std::string type;

    do {
        getline( std::cin, type );

        if ( cin.fail() ) {
            ch = EOF;
            break;
        }

        ch = tolower( type[ 0 ] );
    } while( ch != 'y' && ch != 'n' );

    // interesting things here...

    return 0;
}
-121--3034792-

Если дерево является рекурсивно определенной структурой данных, которая может быть пустой или узлом с левым и правым поддеревьями (например, деревья поиска или куча), то естественное определение состоит в назначении 0 пустому дереву и 1 + высоты верхнего поддерева непустому дереву.

Если дерево является графом, то естественное определение является самым длинным путем от корня к листу, поэтому дерево только корня имеет 0 глубины. Обычно ты даже не считаешь пустые деревья в этом случае.

2
ответ дан 30 November 2019 в 12:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: