Глубина vs высота дерева. Освежающий основы

Я делаю обновление алгоритмов и структур данных.

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

Мне кажется, что основная литература определяет их как применимые к узел и не к дереву.

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

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

например в этом посте Проверьте, сбалансировано ли дерево ответы фокус на высоту дерева при определении баланса может быть, на глубине дерева

правильно ли мое понимание или я путаюсь в этих основах?

9 ответов


говоря о дереве, они имеют в виду одно и то же: длину самого длинного пути от корня до листового узла.


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

  • корневой узел имеет глубина ноль
  • узел X имеет глубина Н
  • на высота из дерева M

высота дерева определяется как глубина его самого глубокого узла.


глубина - это "насколько глубок узел" [или как далеко он от корня]. высота - это "как высоко дерево" [или как далеко от него самый чистый лист]

официально:

height(v) = 0                                                              v is a leaf
            max{height(u)|for every u such that u is a son of v} + 1       else

depth(v) = 0                                                                v root
           depth(u) + 1    where u is the parent of v                       else

редактировать: когда речь идет о концепции максимальной глубины, она идентична высоте дерева [которая максимальна в корне], вы можете доказать это индукцией.


на высота узла-длина самого длинного нисходящего пути к листу от этого узла. Высота корня -высота дерева.

на глубина узла-это длина пути к его корню (т. е. его корневой путь). Это обычно необходимо при манипулировании различными самобалансирующиеся деревья, Деревья AVL в частности. Корневой узел имеет нулевую глубину, листовые узлы имеют нулевую высоту и a дерево только с одним узлом (следовательно, как корень, так и лист) имеет глубину и высоту ноль. Обычно пустое дерево (дерево без узлов, если это разрешено) имеет глубину и высоту -1.


высота дерева-это количество узлов от корня до листьев после длинного пути. Поэтому, если у нас есть один узел (сам корень) height=1 Пустое дерево: 0

и глубина или уровень любого узла - это количество ребер от корневого узла до этого узла. так..глубина корня равна 0.

таким образом, максимальная глубина дерева на единицу меньше высоты дерева.


private static int getHeight(BTreeNode n){

    if(n == null)
        return 0;

    int lHeight = getHeight(n.left);
    int rheight = getHeight(n.right);

    int height = 1+Math.max(lHeight,rheight);

    return height;
}

глубина узла: длина пути от корня до узла. Высота узла: длина пути от узла до самого внутреннего узла (листа).

но высота и глубина в случае дерева такие же. Высота дерева = глубина дерева = максимальная высота = максимальная глубина.


в двоичном дереве поиска

  1. Высота узла: # ребра на самом длинном простом пути вниз от узла к листу
  2. высота дерева: высота корневой
  3. глубина узла: длина простого пути (#ребра) от корня до узла

Высота узла со ссылкой на длину листа самого длинного пути к узлу листа от исходного узла.

глубина узла со ссылкой на корневой узел. - общая длина от исходного узла до корня

но когда вы говорите вообще о целом дереве, оба относятся к одному и тому же, оно отличается, только если вы берете конкретный узел внутри дерева