Глубина 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;
}
глубина узла: длина пути от корня до узла. Высота узла: длина пути от узла до самого внутреннего узла (листа).
но высота и глубина в случае дерева такие же. Высота дерева = глубина дерева = максимальная высота = максимальная глубина.
в двоичном дереве поиска
- Высота узла: # ребра на самом длинном простом пути вниз от узла к листу
- высота дерева: высота корневой
- глубина узла: длина простого пути (#ребра) от корня до узла
Высота узла со ссылкой на длину листа самого длинного пути к узлу листа от исходного узла.
глубина узла со ссылкой на корневой узел. - общая длина от исходного узла до корня
но когда вы говорите вообще о целом дереве, оба относятся к одному и тому же, оно отличается, только если вы берете конкретный узел внутри дерева