알고리즘 & 자료구조

[Algorithm] 이진트리의 순회 알고리즘(JAVA 구현)

반응형

-이진트리란?

  트리의 한 종류로써 대표적인 비선형 자료구조의 형태로 1개의 데이터에 대해 0, 1, 2개의 자식 노드를 가지는 트리를 말한다. 이진트리는 일반적으로 탐색을 할 때 많이 사용하는데 그 이유는 특정 데이터를 탐색하고자 할 때 좌, 우로 나뉘어서 탐색하기 때문에 한쪽을 일방적으로 제외할 수 있어 빠른 탐색속도를 가지게 된다.  이진트리의 구현은 일반적으로 배열과 노드를 이용해 구현이 가능하지만, 완전 이진트리를 제외하고는 배열을 사용할 때 많은 메모리 낭비가 발생하기 때문에 노드로 구현하는 것이 좋다.

 

-이진트리의 순회방식

  이진트리의 순회방식으로는 3가지가 존재하는데 1)전위순회, 2)중위순회, 3)후위순회이다. 이는 탐색하는 순서에 따라 구분되며 D를 현재의 노드, L을 왼쪽 자식노드,R을 오른쪽 자식노드라 할 때 순서대로 각각 D-L-R, L-D-R, L-R-D의 형태로 트리를 순회하게 된다. 후위순회의 경우에는 컴퓨터에서 수식을 연산할 때 사용되므로 계산기와 같은 프로그램을 만들 때 유용하다.

 

class Doubly_List_Node{// 노드 클래스
	private int data; //노드의 데이터 필드
	public Doubly_List_Node Llink; // 노드의 왼쪽 링크 필드
	public Doubly_List_Node Rlink; // 노드의 오른쪽 링크 필드
	
	public Doubly_List_Node() { // 노드의 기본 생성자
		this.data =0;
		this.Llink = null;
		this.Rlink = null;

	}
	
	public Doubly_List_Node(int data) {
		this.data = data;
		this.Llink = null;
		this.Rlink = null;
	}
	
	public Doubly_List_Node(Boolean jud,Doubly_List_Node link) {
		if(jud == true) {
			this.data = 0;
			this.Llink = link;
			this.Rlink = null;
			
		}else {
			this.data = 0;
			this.Llink = null;
			this.Rlink = link;
		}
		
	}
	
	public Doubly_List_Node(Boolean jud,Doubly_List_Node link,int data) {
		if(jud == true) {
			this.data = data;
			this.Llink = link;
			this.Rlink = null;
			
		}else {
			this.data = data;
			this.Llink = null;
			this.Rlink = link;
		}
	}
	
	public Doubly_List_Node(Doubly_List_Node Llink,Doubly_List_Node Rlink) {
			this.data = 0;
			this.Llink = Llink;
			this.Rlink = Rlink;				
	}
	
	public Doubly_List_Node(int data, Doubly_List_Node Llink,Doubly_List_Node Rlink) {
		this.data = data;
		this.Llink = Llink;
		this.Rlink = Rlink;				
}
	
	
	public int getData() { // 노드의 데이터를 반환하는 메소드
		return this.data;
	}
	
	public void setData(int i) {
		this.data = i;
	}
	
}
public class Binary_tree {
	public static void preOrder(Doubly_List_Node prenode) { // 이진트리를 전위순회 출력 방식
		
		if(prenode !=null) { // 공백노드가 아니라면
		System.out.print(prenode.getData() + " / "); 
		preOrder(prenode.Llink);
		preOrder(prenode.Rlink);

		}
	
}
public static void inOrder(Doubly_List_Node prenode) { // 이진트리를 중위순회 출력 방식
	
	if(prenode !=null) { // 공백노드가 아니라면
	
		inOrder(prenode.Llink);
		System.out.print(prenode.getData() + " / "); 
		inOrder(prenode.Rlink);

	}

}
public static void postOrder(Doubly_List_Node prenode) { // 이진트리를 후위순회 출력 방식
	
	if(prenode !=null) { // 공백노드가 아니라면
	
		postOrder(prenode.Llink);
		postOrder(prenode.Rlink);
		System.out.print(prenode.getData() + " / "); 

	}

}
	public static void main(String[] args) {
		
		Doubly_List_Node arr[] = new Doubly_List_Node[16]; //15개의 데이터
		
		for(int i=0;i<arr.length;i++) {
			arr[i] = new Doubly_List_Node(i);
		}
		
		for(int i=1;i<arr.length;i++) {
			if(i %2 ==0) { // i가 2의 배수일 경우 즉, 짝수일 경우 왼쪽 자식노드에 위치하고 
				arr[i/2].Llink = arr[i];
			}else { // 홀수일 경우 오른쪽 자식노드에 위치하게 된다.
				arr[i/2].Rlink = arr[i];
			}
		}
		
		preOrder(arr[1]);
	}

}
반응형