Бинарные деревья. Обход в прямом порядке
Связные списки, стеки и очереди являются линейными структурами данных (это последовательности). Деревья представляют собой нелинейную двумерную структуру данных со специальными свойствами. Узлы дерева содержат две или более ссылок. В этом примере рассматриваются бинарные деревья, т.е. деревья, узлы которого содержат по две ссылки (одна или обе из которых могут быть NULL).
Корневой узел является первым узлом дерева. Каждая ссылка в корневом узле указывает на дочерний узел или узел-потомок. Левый узел-потомок является первым узлом в левом поддереве, а правый узел-потомок является первым узлом в правом поддереве. Узлы-потомки, принадлежащие одному какому-либо узлу, называются родственными узлами. Узел без узлов-потомков называется листом дерева или концевым узлом. Компьютерщики обычно рисуют деревья сверху-вниз, начиная с корневого узла, то есть противоположно тому, как растут деревья в природе.
В этом примере рассмотрим обход бинарного дерева в прямом порядке. Каждый узел посещается до того, как посещены его потомки.
Для корня дерева выполняются следующие шаги:
- Посетить узел
- Обойти левое поддерево
- Обойти правое поддерево
Это может быть реализовано двумя способами
- рекурсивно
- итерационно (пошагово)
Шаги для итерационного решения:
Создать пустой стек и поместить в него корневой узел.
Выполните следующие действия, до тех по пока стек не пуст:
Возьмите узел из стека, и распечатайте его
Поместите правого потомка узла в стек
Поместите левого потомка узла в стек
Мы помещаем первым правого потомка, но он будет обработан после левого поддерева, так как стек организован по принципу Last In First Out (LIFO).
package java1; import java.util.Stack; public class Test { public static class TreeNode { int data; TreeNode left; TreeNode right; TreeNode(int data) { this.data=data; } } // Recursive Solution public void recursive(TreeNode root) { if(root != null) { //Visit the node-Printing the node data System.out.printf("%d ",root.data); recursive(root.left); recursive(root.right); } } // Iterative solution public void Iter(TreeNode root) { if(root == null) return; Stack<TreeNode> stack = new Stack<TreeNode>(); stack.push(root); while(!stack.empty()){ TreeNode n = stack.pop(); System.out.printf("%d ",n.data); if(n.right != null){ stack.push(n.right); } if(n.left != null){ stack.push(n.left); } } } public static void main(String[] args) { Test bi=new Test(); // Creating a binary tree TreeNode rootNode=createTest(); System.out.println("Using Recursive solution:"); bi.recursive(rootNode); System.out.println(); System.out.println("-------------------------"); System.out.println("Using Iterative solution:"); bi.Iter(rootNode); } public static TreeNode createTest() { TreeNode rootNode =new TreeNode(40); TreeNode node20=new TreeNode(20); TreeNode node10=new TreeNode(10); TreeNode node30=new TreeNode(30); TreeNode node60=new TreeNode(60); TreeNode node50=new TreeNode(50); TreeNode node70=new TreeNode(70); rootNode.left=node20; rootNode.right=node60; node20.left=node10; node20.right=node30; node60.left=node50; node60.right=node70; return rootNode; } }
Результат выполнения программы:
Using Recursive solution: 40 20 10 30 60 50 70 ------------------------- Using Iterative solution: 40 20 10 30 60 50 70