노드(Node)
: 트리구조의 자료값을 담고있는 단위에지(Edge)
: 노드 간의 연결선(link, branch)루트 노드(Root)
: 부모가 없는 노드, 최상위 노드잎새 노드(Leaf)
: 자식이 없는노드 (=단말)내부 노드(Internal)
: 잎새노드를 제외한 모든 노드부모(Parent)
: 연결된 두 노드중 상위의 노드자식(Child)
: 연결된 두 노드중 하위의 노드형제(Sibling)
: 같은 부모를 가지는 노드깊이(Depth)
: 루트에서 어떤 노드까지의 간선의 수레벨(Level)
: 트리의 특정 깊이를 가지는 노드 집합높이(Height)
: 트리에서 가장 큰 레벨 값크기(Size)
: 자신을 포함한 자식 노드의 개수차수(Degree)
: 각 노드가 지닌 가지의 수트리의 차수
: 트리의 최대 차수노드
에서 다른 노드
로 이동하는 경로는 유일노드
가 N개인 트리의 Edge
의 수는 N-1개노드
는 서로 연결되어있음Edge
를 끊으면 2개의 Sub-Tree로 분리됨모든 레벨에서 노드들이 꽉 채워져있는 트리
마지막 레벨을 제외하고 노드들이 모두 채워져있는 트리
모든 노드가 0개 또는 2개의 자식 노드를 갖는 트리
한 쪽으로 기울어진 트리
ex) LinkedList
모든 노드의 좌우 서브트리 높이가 1이상 차이나지 않는 트리
모든 노드를 빠드리거나 중복하지 않고 방문하는 연산
방문순서는 루트노드 - 왼쪽노드 - 오른쪽 노드
루트노드로 부터 왼쪽 노드 부터 오른쪽 노드로 감
방문 순서는 왼쪽노드 - 루트노드 - 오른쪽 노드
왼쪽노드 쪽으로 깊이를 쭉 파서 말단노드까지 간 후 오른쪽 노드들을 거침
방문 순서는 왼쪽노드 - 오른쪽노드 - 루트노드
아래 왼쪽부터 오른쪽 노드들을 거쳐 루트노드로 감
방문 순서는 위쪽 레벨부터 왼쪽노드 - 오른쪽노드
레벨순회순으로 배열에 구성
ex) 1 -> 2,3 | 2-> 4,5 | 3-> 6,7
값과 간선을 관리하기 위한 노드로 연결리스트 구성
class Node{
char data;
Node left;
Node right;
public Node(char data, Node left, Node right){
this.data = data;
this.left = left;
this.right = right;
}
}
class BinaryTree2{
Node head;
BinaryTree2(){}
BinaryTree2(char[] arr){
for(int i = 0; i< arr.length; i++){
nodes[i] = new Node(arr[i], null, null);
}
for(int i =0; i<arr.length; i++){
int left = 2 * i + 1;
int right = 2 * i + 2;
if( left< arr.length){
nodes[i].left = nodes[left];
}
if( right< arr.length){
nodes[i].right = nodes[right];
}
this.head = nodes[0];
}
}
public void preOrder(Node node){
if(node == null){
return;
}
System.out.print(node.data + " ");
this.preOrder(node.left);
this.preOrder(node.right);
}
public inOrder(Node node){
if(node == null){
return;
}
this.inOrder(node.left);
System.out.print(node.data + " ");
this.inOrder(node.right);
}
public postOrder(Node node){
if(node == null){
return;
}
this.postOrder(node.left);
this.postOrder(node.right);
System.out.print(node.data + " ");
}
public void levelOrder(Node node){
Queue<Node> queue = new LinkedList<>();
queue.add(node);
while(!queue.isEmpty(){
Node cur = queue.poll();
System.out.print(cur.data+ " ");
if(cur.left != null){
queue.offer(cur.left);
}
if(cur.right != null){
queue.offer(cur.right);
}
}
}
}
levelOrder
의 경우 Queue
를 이용해 쉽게 할 수 있다.