노드가 하나 이상의 자식을 가지면 트리라고 부른다. 그중에 child Node가 최대 2개까지만 붙는 Tree를 binary tree라고 부른다. (3개 붙는 트리는 ternary tree)
마지막 level을 제외한 모든 서브 트리의 레벨이 같아야하고 마지막 레벨은 왼쪽부터 채워져 있으면 완전 이진 트리이다.
노드들의 child가 하나도 없거나 2개인 경우로만 구성된 트리
빈공간 없이 모든 노드가 2개의 자식을 가지고 레벨도 정확하게 딱 떨어지는 완벽한 피라미드 구조 형성
# Tree 구현 코드
/*
(1)
↙ ↘
(2) (3)
↙ ↘
(4) (5)
Inorder (Left, Root, Right): 4 2 5 1 3
Preorder (Root, Left, Right): 1 2 4 5 3
Postorder (Left, Right, Root): 4 5 2 3 1
*/
class Node{
int data;
Node left;
Node right;
}
class Tree{
public Node root;
public void setRoot(Node node){
this.root = node;
}
public Node getRoot(){
return root;
}
public Node makeNode(Node left, int data, Node right){
Node node = new Node();
node.data = data;
node.left = left;
node.right = right;
return node;
}
public void inorder(Node node){
if(node != null){
inorder(node.left);
System.out.println(node.data);
inorder(node.right);
}
}
public void preorder(Node node){
if(node != null){
System.out.println(node.data);
preorder(node.left);
preorder(node.right);
}
}
public void postorder(Node node){
if(node != null){
postorder(node.left);
postorder(node.right);
System.out.println(node.data);
}
}
}
# 테스트 클래스
public class TreeTest{
public static void main(String[] args){
Tree t = new Tree();
Node n4 = t.makeNode(null, 4, null);
Node n5 = t.makeNode(null, 5, null);
Node n2 = t.makeNode(n4, 2, n5);
Node n3 = t.makeNode(null, 3, null);
Node n1 = t.makeNode(n2, 1, n3);
t.setRoot(1);
t.inorder(t.getRoot());
t.preorder(t.getRoot());
t.postorder(t.getRoot());
}
}
# 결과 값
4
2
5
1
3
1
2
4
5
3
4
5
2
3
1
최대값이나 최소값을 찾아내는 연산을 빠르게 하기 위해 고안된 완전 이진 트리를 기본으로 한 자료구조
문자열에서 검색을 빠르게 해주는 트리 구조
# 배열을 이진검색트리로 만드는 구현 코드
class Tree{
class Node{
int data;
Node left;
Node right;
Node(int data){
this.data = data;
}
Node root;
public void makeTree(int[] a){
root = makeTreeR(a, 0, a.length - 1);
}
public Node makeTreeR(int[] a, int start, int end){
if(start > end) return null;
int mid = (start + end) / 2;
Node node = new Node(a[mid]);
node.left = makeTreeR(a, start, mid - 1);
node.right = makeTreeR(a, mid + 1, end);
return node;
}
public void searchBTree(Node n, int find){
if(find < n.data){
System.out.println("Data is smaller than " + n.data);
searchBTree(n.left, find);
}
else if(find > n.data){
System.out.println("Data is bigger than" + n.data);
searchBTree(n.right);
}
else{
System.out.println("Data found!");
}
}
}
}
# 테스트 클래스
public class ArrBinaryTreeTest{
public static void main(String[] args){
int[] a = new int[10];
for(int i = 0;i < a.length;i++){
a[i] = i;
}
Tree t = new Tree();
t.makeTree(a);
t.searchBTree(t.root, 2);
}
}
# 결과 값
Data is smaller than 4
Data is bigger than 1
Data found!