В этой статье объясняется, как найти высоту узла в заданном бинарном дереве. Определение высоты узла является важным фактором при построении самобалансирующегося дерева или дерева AVL. Высота узла играет важную роль в повороте дерева при построении деревьев AVL. Как мы знаем, высота пустого дерева (без узлов) равна -1, а высота дерева только с одним узлом (корневым узлом) равна 0. Мы применяем ту же концепцию при вычислении высоты данного узла в дереве. Чтобы проиллюстрировать концепцию, мы строим бинарное дерево поиска, как показано ниже:
Обратите внимание, что приведенное выше дерево не сбалансировано.
Нам нужно найти высоту узла 25. Итак, мы начинаем с корневого узла дерева, который равен 5. Мы предпочитаем сначала посещать левое поддерево, а затем правое поддерево. После посещения каждого поддерева слева и справа мы проверяем, имеет ли текущий узел те же данные, что и узел, для которого нам нужно найти высоту. Чтобы узнать высоту узла, мы пишем лаконичный код с рекурсией. Ниже приведен код для определения высоты заданного узла.
public class HeightBSTNode { Node root; Node add (Node node, int data) { if (null == node) return new Node (data); else if (data < node.data) node.left = add (node.left, data); else if (data > node.data) node.right = add (node.right, data); return node; } static int findHeight (Node Node, int data, int height, Value V) { if (Node == null) return height; // Go to left subtree int level = findHeight (Node.left, data, height+1, V); if (Node.data == data) V.v = level; // Go to right subtree level = findHeight (Node.right, data, height+1, V); if (Node.data == data) V.v = level; return height; } public static void main (String[] args) { HeightBSTNode a = new HeightBSTNode(); Value V = new Value(); // create a tree. a.root = add (a.root, 5); a.root = add (a.root, 3); a.root = add (a.root, 2); a.root = add (a.root, 10); a.root = add (a.root, 15); a.root = add (a.root, 12); a.root = add (a.root, 25); a.root = add (a.root, 35); findHeight (a.root, 25, -1, V); System.out.println ("Height of node "+25+" is "+V.v); } } class Node { int data; Node left, right; Node (int data) { this.data=data; } } class Value { int v; }
Функция main() начинает вызывать findHeight()сroot, data, -1, V. В нашем случае данные, для которых нам нужно найти высоту, — это node с значение 25, начальная высота, которую мы принимаем равной -1, и V используется для хранения высоты узла, на который мы можем ссылаться, когда вызов возвращается к main(). Уровень используется для хранения высоты левого поддерева и правого поддерева. При выполнении каждого рекурсивного вызова мы увеличиваем высоту на 1. Когда возвращаются вызовы как левого, так и правого поддерева, мы возвращаем высоту в стеке вызовов. Это важно, когда мы переходим от левого поддерева к корню и от правого поддерева к корню. Временная сложность findHeight() составляет O(N).
После запуска программа печатает:
Height of node 25 is 3 Similarly the height of nodes 35 and 2 is as below Height of node 35 is 4 Height of node 2 is 2
Вывод
В этой статье мы посетили код для вычисления высоты заданного узла в двоичном дереве. Вычисление высоты узла является важным шагом в алгоритме вращения дерева.