public void printTree(Node node) { if (node == null) { return; } System.out.print(node.value + " "); printTree(node.left); printTree(node.right); }
public void printTree(Node node) { if (node == null) { return; } printTree(node.left); System.out.print(node.value + " "); printTree(node.right); }
Что такое бинарное дерево
Бинарные деревья используются для различных целей, например, для хранения данных в отсортированном порядке или для решения задач поиска, добавления и удаления элементов. Также они широко используются в компьютерных алгоритмах и структурах данных.
В Java бинарное дерево может быть реализовано с использованием класса, представляющего узел дерева, а также методов для добавления, удаления и обхода этого дерева.
Примеры кода
Пример 1:
Ниже приведен пример реализации класса для бинарного дерева в Java:
class Node {
int data;
Node left, right;
Node(int item) {
data = item;
left = right = null;
}
}
class BinaryTree {
Node root;
BinaryTree(int key) {
root = new Node(key);
}
BinaryTree() {
root = null;
}
void printInorder(Node node) {
if (node == null)
return;
printInorder(node.left);
System.out.print(node.data + " ");
printInorder(node.right);
}
void printInorder() {
printInorder(root);
}
public static void main(String[] args) {
BinaryTree tree = new BinaryTree();
tree.root = new Node(1);
tree.root.left = new Node(2);
tree.root.right = new Node(3);
tree.root.left.left = new Node(4);
tree.root.left.right = new Node(5);
System.out.println("Inorder traversal of binary tree is ");
tree.printInorder();
}
}
Пример 2:
class Node {
int data;
Node left, right;
Node(int item) {
data = item;
left = right = null;
}
}
class BinaryTree {
Node root;
BinaryTree(int key) {
root = new Node(key);
}
BinaryTree() {
root = null;
}
String printTree(Node node) {
String result = "";
if (node != null) {
result += printTree(node.left);
result += node.data + " ";
result += printTree(node.right);
}
return result;
}
public static void main(String[] args) {
BinaryTree tree = new BinaryTree();
tree.root = new Node(1);
tree.root.left = new Node(2);
tree.root.right = new Node(3);
tree.root.left.left = new Node(4);
tree.root.left.right = new Node(5);
String treeString = tree.printTree(tree.root);
System.out.println("Binary tree: " + treeString);
}
}
В приведенном выше коде демонстрируется метод printTree, который рекурсивно обходит бинарное дерево в порядке in-order и возвращает его элементы в виде строки.
public void printInOrder(Node node) {
if (node != null) {
printInOrder(node.left);
System.out.print(node.value + " ");
printInOrder(node.right);
}
}
В данном примере мы создаем функцию printInOrder, которая принимает в качестве аргумента узел дерева.
наконец, вызывает себя для правого поддерева. Таким образом, функция будет рекурсивно обходить все узлы дерева,
Node root = new Node(1);
root.left = new Node(2);
root.right = new Node(3);
root.left.left = new Node(4);
root.left.right = new Node(5);
printInOrder(root);
В результате выполнения данного кода будет выведено «4 2 5 1 3», что соответствует порядку инфиксного обхода данного бинарного дерева.
В Java существует несколько способов реализации стека. Один из самых простых способов — использование класса Stack из пакета java.util.
import java.util.Stack;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
public class BinaryTreeTraversal {
public static void printTree(TreeNode root) {
if (root == null) {
return;
}
Stack stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
System.out.println(node.val);
if (node.right != null) {
stack.push(node.right);
}
if (node.left != null) {
stack.push(node.left);
}
}
}
public static void main(String[] args) {
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
printTree(root);
}
}
Выходные данные приведенного кода будут:
1
2
4
5
3
Решения
Рекурсивный метод обхода дерева:
public void printTree(TreeNode root) { if (root != null) { printTree(root.getLeftChild()); System.out.print(root.getData() + " "); printTree(root.getRightChild()); } }
Обход дерева в ширину с использованием очереди:
public void printTree(TreeNode root) { Queue
queue = new LinkedList<>(); queue.add(root); while (!queue.isEmpty()) { TreeNode current = queue.poll(); System.out.print(current.getData() + " "); if (current.getLeftChild() != null) { queue.add(current.getLeftChild()); } if (current.getRightChild() != null) { queue.add(current.getRightChild()); } } } Построение строкового представления дерева:
public String treeToString(TreeNode root) {
if (root == null) {
return "";
}
StringBuilder sb = new StringBuilder();
sb.append(root.getData());
String leftChildString = treeToString(root.getLeftChild());
String rightChildString = treeToString(root.getRightChild());
if (!leftChildString.isEmpty()