
트리란 노드와 링크로 구성된 그래프의 일종이며 Cycle을 가지지 않는 자료구조이다. 계층적 구조를 나타낼 때 사용되기 때문에 폴더구조, 조직도, 가계도와 유사한 모습을 보인다.


이진 트리는 각각의 노드가 최대 두 개의 자식 노드를 가지는 트리 자료 구조로, 자식 노드를 각각 왼쪽 자식 노드와 오른쪽 자식 노드라고 한다.
모든 노드를 빠뜨리거나 중복하지 않고 방문하는 연산


class TreeNode {
int data;
TreeNode left, right;
public TreeNode(int item) {
data = item;
left = right = null;
}
}
class BinaryTreeArray {
TreeNode[] nodes;
int maxSize;
int size;
public BinaryTreeArray(int maxSize) {
this.maxSize = maxSize;
this.size = 0;
nodes = new TreeNode[maxSize];
}
public void insert(int data) {
if (size < maxSize) {
nodes[size++] = new TreeNode(data);
} else {
System.out.println("Tree is full, cannot insert more nodes.");
}
}
public void preorderTraversal() {
System.out.print("Preorder Traversal: ");
preorderTraversalRec(0);
System.out.println();
}
private void preorderTraversalRec(int index) {
if (index < size && nodes[index] != null) {
System.out.print(nodes[index].data + " ");
preorderTraversalRec(2 * index + 1);
preorderTraversalRec(2 * index + 2);
}
}
public void inorderTraversal() {
System.out.print("Inorder Traversal: ");
inorderTraversalRec(0);
System.out.println();
}
private void inorderTraversalRec(int index) {
if (index < size && nodes[index] != null) {
inorderTraversalRec(2 * index + 1);
System.out.print(nodes[index].data + " ");
inorderTraversalRec(2 * index + 2);
}
}
public void postorderTraversal() {
System.out.print("Postorder Traversal: ");
postorderTraversalRec(0);
System.out.println();
}
private void postorderTraversalRec(int index) {
if (index < size && nodes[index] != null) {
postorderTraversalRec(2 * index + 1);
postorderTraversalRec(2 * index + 2);
System.out.print(nodes[index].data + " ");
}
}
public void levelOrderTraversal() {
System.out.print("Level Order Traversal: ");
for (int i = 0; i < size; i++) {
if (nodes[i] != null) {
System.out.print(nodes[i].data + " ");
}
}
System.out.println();
}
}
public class Main {
public static void main(String[] args) {
BinaryTreeArray treeArray = new BinaryTreeArray(10);
treeArray.insert(1);
treeArray.insert(2);
treeArray.insert(3);
treeArray.preorderTraversal();
treeArray.inorderTraversal();
treeArray.postorderTraversal();
treeArray.levelOrderTraversal();
}
}
class TreeNode {
int data;
TreeNode left, right;
public TreeNode(int item) {
data = item;
left = right = null;
}
}
class BinaryTreeLinkedList {
TreeNode root;
public BinaryTreeLinkedList() {
root = null;
}
public void insert(int data) {
root = insertRec(root, data);
}
private TreeNode insertRec(TreeNode root, int data) {
if (root == null) {
root = new TreeNode(data);
return root;
}
if (data < root.data) {
root.left = insertRec(root.left, data);
} else if (data > root.data) {
root.right = insertRec(root.right, data);
}
return root;
}
public void preorderTraversal() {
System.out.print("Preorder Traversal: ");
preorderTraversalRec(root);
System.out.println();
}
private void preorderTraversalRec(TreeNode node) {
if (node != null) {
System.out.print(node.data + " ");
preorderTraversalRec(node.left);
preorderTraversalRec(node.right);
}
}
public void inorderTraversal() {
System.out.print("Inorder Traversal: ");
inorderTraversalRec(root);
System.out.println();
}
private void inorderTraversalRec(TreeNode node) {
if (node != null) {
inorderTraversalRec(node.left);
System.out.print(node.data + " ");
inorderTraversalRec(node.right);
}
}
public void postorderTraversal() {
System.out.print("Postorder Traversal: ");
postorderTraversalRec(root);
System.out.println();
}
private void postorderTraversalRec(TreeNode node) {
if (node != null) {
postorderTraversalRec(node.left);
postorderTraversalRec(node.right);
System.out.print(node.data + " ");
}
}
public void levelOrderTraversal() {
System.out.print("Level Order Traversal: ");
int height = height(root);
for (int i = 1; i <= height; i++) {
printGivenLevel(root, i);
}
System.out.println();
}
private int height(TreeNode root) {
if (root == null) {
return 0;
} else {
int leftHeight = height(root.left);
int rightHeight = height(root.right);
return Math.max(leftHeight, rightHeight) + 1;
}
}
private void printGivenLevel(TreeNode root, int level) {
if (root == null) {
return;
}
if (level == 1) {
System.out.print(root.data + " ");
} else if (level > 1) {
printGivenLevel(root.left, level - 1);
printGivenLevel(root.right, level - 1);
}
}
}
public class Main {
public static void main(String[] args) {
BinaryTreeLinkedList treeLinkedList = new BinaryTreeLinkedList();
treeLinkedList.insert(1);
treeLinkedList.insert(2);
treeLinkedList.insert(3);
treeLinkedList.preorderTraversal();
treeLinkedList.inorderTraversal();
treeLinkedList.postorderTraversal();
treeLinkedList.levelOrderTraversal();
}
}