root
라고 한다. 노드 - 트리의 원소 ( A,B,C,D,E,F,G,H,I,J,K )
간선 - 노드를 연결하는 선, 부모 노드와 자식 노드를 연결
루트 노드 - 트리의 시작 노드
형제 노드 - 같은 부모 노드의 자식 노드들 ( B,C,D는 하나의 형제 )
조상 노드 - 간선을 따라 루트 노드까지 이르는 경로에 있는 모든 노드들 (k의 조상 : F,B,A )
서브 트리 - 부모 노드와 연결된 간선을 끊었을 때 생성되는 트리
자손 노드 - 서브트리에 있는 하위 레벨의 노드들 ( B의 자손 노드 - E,F,K )
단말 노드 - 연결된 간선이 없는 노드 ( E,K,G,H,I,J )
i/2
2 * i
2 * i + 1
2^n
이와 같이 편향 노드를 사용하게 되는 경우, 메모리 용량을 과하게 차지한다.
트리의 중간에 새로운 노드를 삽입하거나 기존의 노드를 삭제할 경우 배열의 크기 변경이 어려워 비효율적이다.
이러한 단점을 보완하기 위해 연결 리스트 를 이용한 트리를 표현할 수 있다. .
순회 : 중복되지 않게 전부 방문하는 것. 트리는 비선형 구조기이기 때문에, 선형 구조에서와 같이 선후 연결 관계를 알 수 없다.
순회 방법 = 부모 노드를 기준으로 생각하면 된다
public class Tree_전위순회 {
static char[] tree = { 0,'A','B','C','D','E','F','G', 0,0, 'H','I'};
public static void main(String[] args) {
System.out.println("전위 순회 : ");
preorder(1);
System.out.println();
System.out.println("중위 순회 : ");
inorder(1);
System.out.println();
System.out.println("후위 순회 : ");
postorder(1);
System.out.println();
}
// 매개변수로 트리의 루트 index 받기
// 전위 순회
// V -> L -> R
static public void preorder(int root) {
if(root >= tree.length || tree[root] == 0) { // 0은 root를 뜻하므로 돌려준다.
return;
}
System.out.print(tree[root] + "->");
preorder(root * 2);
preorder(root * 2 + 1);
}
// 중위 순회
// L -> V -> R
static public void inorder(int root) {
if(root >= tree.length || tree[root] == 0) { // 0은 root를 뜻하므로 돌려준다.
return;
}
inorder(root * 2);
System.out.print(tree[root] + "->");
inorder(root * 2 + 1);
}
// 후위 순회
// L -> R -> V
static public void postorder(int root) {
if(root >= tree.length || tree[root] == 0) { // 0은 root를 뜻하므로 돌려준다.
return;
}
postorder(root * 2);
postorder(root * 2 + 1);
System.out.print(tree[root] + "->");
}
}
public class Tree2_수식트리 {
static char[] tree = {0, '+', '*', '-', '1', '2', '3', '4'};
public static void main(String[] args) {
inorder(1); // 1*2+3-4
}
// 중위 순회
static void inorder(int root) {
// 기저조건
// 1. 인덱스가 배열 범위를 벗어난 경우
if(root >= tree.length && root > 0) return;
// 2. 리프 노드인 경우 (항상 피연산자, 즉 숫자인 것인지 확인
if( tree[root] >= '0' && tree[root] <= '9') {
System.out.print(tree[root]);
return;
}
inorder(root*2); // 좌측 잎
System.out.print(tree[root]); // 루트 방문
inorder(root*2 + 1); // 우측 잎
}
}