Высота древовидной структуры данных
В этом уроке мы обсудим бинарные деревья. Мы увидим, как вычислить высоту древовидной структуры данных рекурсивно, а также итеративно.
Бинарные деревья
- Рекурсивный способ
- Итеративный способ
Высота дерева - рекурсивно
Рекурсия включает в себя вычисление результатов подзадач и возврат их к родительской проблеме.
Шаги:
- Чтобы рекурсивно вычислить высоту дерева, нам нужно рекурсивно найти высоту его левого и правого поддеревьев и добавить к ним 1 (высота между самым верхним узлом и его дочерними элементами).
- Каждое из этих поддеревьев может иметь левое и правое поддеревья, поэтому рекурсия будет применяться до тех пор, пока поддеревья не станут NULL. Высота пустого узла дерева равна -1.
- Наконец, мы сравним высоту левого и правого поддеревьев и вернем то, которое больше.
package com.journaldev.tree.height;
public class BinaryTree {
TreeNode root;
public static class TreeNode {
TreeNode left;
TreeNode right;
Object data;
TreeNode(Object data) {
this.data = data;
left = right = null;
}
}
}
Давайте посмотрим код для нахождения высоты дерева с помощью рекурсии.
package com.journaldev.tree.height;
import com.journaldev.tree.height.BinaryTree.TreeNode;
public class HeightOfTree {
public static void main(String[] args) {
BinaryTree binaryTree = new BinaryTree();
/**
* Binary Tree in our example, height = 2
* 1 (Root)
* 2 3 (Level 1)
* 4 5 (Level 2)
*/
binaryTree.root = new TreeNode(1);
binaryTree.root.left = new TreeNode(2);
binaryTree.root.right = new TreeNode(3);
binaryTree.root.left.left = new TreeNode(4);
binaryTree.root.right.left = new TreeNode(5);
int heightOfTree = height(binaryTree.root);
System.out.printf("Height of tree is %d", heightOfTree);
}
public static int height(TreeNode root) {
if (root == null)
return -1;
int leftHeight = height(root.left);
int rightHeight = height(root.right);
return Math.max(leftHeight, rightHeight) + 1;
}
}
Итак, в приведенном выше коде, как только мы достигаем самого нижнего дочернего узла, мы добавляем единицу к высоте дерева и возвращаем результат предыдущему вызову. Вывод: высота дерева равна 2. Теперь сделаем то же самое нерекурсивно.
Высота дерева - итеративно
Чтобы вычислить высоту дерева итеративно, нам просто нужно вычислить количество уровней в дереве.
Затраченные шаги
- Создайте очередь и добавьте в нее корень дерева.
- Извлеките узел из очереди и пройдите вниз по очереди, добавляя дочерние узлы в очередь.
- В каждой итерации всплывает последний элемент, добавляемый в очередь, и добавляются элементы следующего уровня (этого элемента) в очередь.
- Делайте это до тех пор, пока размер очереди не станет равным нулю. Это будет означать, что на следующем уровне нет элементов.
- За каждый пройденный уровень прибавляйте 1.
Ниже приведена итеративная программа для вычисления высоты дерева.
public static int heightIteratively(TreeNode root) {
if (root == null)
return -1;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
int height = -1;
while (!queue.isEmpty()) {
int size = queue.size();
height++;
while (size > 0) {
TreeNode treeNode = queue.remove();
if (treeNode.left != null)
queue.add(treeNode.left);
if (treeNode.right != null)
queue.add(treeNode.right);
size--;
}
}
return height;
}
Временная сложность — O(n). Космическая сложность O (1).
Вы можете получить полный код и другие примеры DS и алгоритмов в нашем репозитории GitHub.