이번주는 설연휴가 있어 공부한 내용이 짧지만 굉장히 중요한 것들이 많이 있다. 오늘은 연휴가 끝나는 날인 일요일인데 연휴 전에 생각했던것보다 많은 것을 하지 않은것 같아 아쉬움이 조금 남는다. 한번에 확 몰아서 하는것보다 하루에 조금씩 꾸준히 채워 나가자!!
구현 방법
데이터 접근
배열의 인덱스를 이용해 원하는 위치의 데이터에 접근 할 수 있다.
삽입연산
삽입 위치의 다음의 항목들을 이동해야한다.
삭제연산
삭제 위치 다음의 항목들을 이동해야한다. ( 저장된 원소까지만 접근하게 해야한다.)
문제점
단순 배열을 이용해 순차리스트를 구현해 사용하는 경우, 자료의 삽입/삭제 연산과정에서 연속적인 메모리 배열을 위해 원소들을 이동시키는 작업이 필요하다.
원소의 개수가 많고 삽입/삭제 연산이 비번하게 일어날 수록 작업에 소요되는 시간이 크게 증가한다.
배열의 크기가 정해져 있는 경우 실제로 사용될 메모리 보다 크게 할당하여 메모리의 낭비를 초래할 수 도 있고 반대로 할당된 메모리보다 많은 자료를 사용하여 새롭게 배열을 만들어 작업해야하는 경우가 발생 할 수도 있다.
### 노드
- 연결 리스트에서 하나의 원소에 필요한 데이터를 갖고 있는 자료단위
- 구성요소
1)데이터 필드
- 원소의 값을 저정하는 자료구조
- 저장할 원소의 종류나 크기에 따라 구조를 정의하여 사용함.
-
2) 링크 필드
- 다음 노드의 주소를 저장하는 자료구조
### 헤드
- 리스트의 처음 노드를 가리키는 레퍼런스
### 연결 구조
- 노드가 하나의 링크 필드에 의해 다음 노드와 연결되는 구조를 가진다.
- 헤드가 가장 앞의 노드를 가리키고, 링크 필드가 연속적으로 다음 노드를 가리킨다.
- 최종적으로 NULL을 가리키는 노드가 리스트의 가장 마지막 노드다.
4. head에 새로운 노드 new의 주소값을 저장
메모리를 할당하여 새로운 노드 new 생성
새로운 노드 new의 데이터 필드에 'C'저장
Head에 저장된 주소값을 새로운 노드의 링크 필드값에 저장
4.Head에 새로운 노드의 주솟값을 저장
단순 연결리스트가 중간에 삽입 하려고 할때 앞에 연결된 연결리스트를 알아야하는 점을 보완하기 위해 이중 연결리스트로 해결 가능하다.
⇒ 궁극적으로 내가 표현하고 싶은 데이터들은 단말 노드에 담기는 경우가 많다.
노드(node)- 트리의 원소
트리 T의 노드 : A B C D E G H H I J K
형제 노드
조상 노드
자손 노드
서브 트리(Subtree)
⇒ 어떠한 노드 위치에서 subtree의 개수는 → 자식수 ⇒ 즉 간선의 수이다.
모든 노드들이 2개의 서브트리를 갖는 특별한 형태의 트리
각 노드가 자식 노드를 최대한 2개 까지만 가질 수 잇는 트리
포화 이진 트리
편향 이진 트리
- 높이 H에 대한 최소 개수의 노드를 가지면서 한쪽 방향의 자식 노드 만을 가진 이진 트리
- 왼쪽 편향 이진 트리
- 오른쪽 편향 이진 트리
배열을 이용한 이진 트리의 표현
큐가 존재 할떄 A 를 방문 한경우 A의 자식 BCD를 큐에 집어 넣는다.
⇒ A B C D
| 너비 1|
A가 나가고 B에 방문한경우 EF를 큐에 집어 넣는다
⇒ B C D E F
C D E F
D E F G H I
| 너비 2 |
⇒ 너비가 0인 노드들이 너비가 1인 것들을 큐에 채우게 되고 너비가 1인것들이 너비가 2인것들을 큐에 채우게 된다.
import java.util.LinkedList;
import java.util.Queue;
public class CompleteBinaryTree {
private char[] nodes;
private int lastIndex;
private final int SIZE;
public CompleteBinaryTree(int size) {
SIZE = size;
nodes = new char[size+1];
}
public boolean isEmpty() {
return lastIndex==0;
}
public boolean isFull() {
return lastIndex == SIZE;
}
public void add(char e) {
if(isFull()) {
System.out.println("포화 상태입니다.");
return;
}
nodes[++lastIndex] = e;
}
public void bfs() {
if(isEmpty())return;
//탐색 순서 번호를 큐로 관리
Queue<Integer> que = new LinkedList<Integer>();
que.offer(1);
int current;
while(!que.isEmpty()) {
current = que.poll();
System.out.println(nodes[current]);
if(current*2<=lastIndex) //왼쪽자식
{
que.offer(current*2);
}
if(current*2+1<=lastIndex) //왼쪽자식
{
que.offer(current*2+1);
}
}
}
//너비 정보를 따로 갖고 있지 않고 레벨에따라 구분할수 있는 bfs 탐색
public void bfs2() {
if(isEmpty())return;
Queue<Integer> que = new LinkedList<>();
que.offer(1);
int current,size,level=0;
//탐색 순서 번호를 큐로 관리
while(!que.isEmpty()) {
//레벨
//사이즈를 체크하고
size = que.size();
System.out.println("level "+ level);
//사이즈 만큼 체크한다 -> 레벨별로 출력
while(--size>=0) {
current = que.poll();
System.out.println(nodes[current]);
if(current*2<=lastIndex) //왼쪽자식
{
que.offer(current*2);
}
if(current*2+1<=lastIndex) //왼쪽자식
{
que.offer(current*2+1);
}
}
System.out.println();
++level;
}
}
}
F5 → 메소드를 타고 들어감
F6 → 메소드를 타고 들어 가지 않고 다음 줄로 이동
F7 → 현재 함수 끝까지 바로 가서 리턴한 후 함수 호출
F8 은 다음 브레이크포인트로 가는것이 아니라 → 원래 실행하던대로 실행해라 대신, 브레이크포인트가 또 있다면 거기서 멈추게 됨.
(1) Skip All Breakpoints:모든 브레이크 포인트 건너뛰기
(2) Resume(F8키):멈추어 있던 쓰레드를 다시 진행시키고 다음 브레이크포인트까지 실행(3) Suspend:쓰레드를 일시 정지한다. 강제로 breakpoint를 현재 수행문에 지정한 것과 같다.
(4) Terminate:종료
(5) Step Into(F5키):프로그램을 한 스텝진행, 다음 실행 문이 함수 안이면 함수 안으로 들어감.(6) Step Over(F6키):함수 호출을 지나치고 현재 위치에서 한 스텝씩 진행(7) Step Return(F7키):현재 함수 끝까지 바로 가서 리턴한 후 함수 호출부로 되돌아 간다.(8) Drop to Frame:선택한 스택 프레임의 첫 행으로 실행 포인트를 옮긴다. 특정 함수를 실행하다 그 함수의 처음부터 다시 디버깅하려고 할때.(9) Use Step Filters(Shift+F5):스텝 필터링
깊이 우선 탐색
루트 노드에서 출발하여 한 방향으로 갈 수 있는 경로가 있는 곳까지 깊이 탐새해 가다가 더 이상 갈 곳이 없게 되면, 가장 마지막에 만났던 갈림길 간선이 있는 노드로 되돌아와서 다른 방향의 노드로 탐색을 계속 반복하여 결국 모든 노드를 방문하는 순회 방법
가장 마지막에 만났던 갈림길의 노드로 되돌아가서 다시 깊이 우선 탐색을 반복해야 하므로 재귀적으로 구현하거 나 후입선출 구조의 스택을 사용해서 구현
순회(traversal)
트리의 노드들을 체계적으로 방문하는것
3가지 기본적인 순회법
부모노드 방문 후 , 자식노드들을 좌우 순서대로 방문
순서 1 : A → T1→T2
순서 2: A → B(T3) E → C F G
총 순서 : → A B D H I E C F G
### 중위순회
왼쪽자식 노드 , 부모노드 , 오른쪽 자식노드 순으로 방문한다.
### 후위순회
자식노드를 좌우 순서로 방문한 후, 부모노드로 방문한다.
완전 이진 트리에 있는 노드 중에서 키 값이 가장 큰 노드나 키 값이 가장 작은 노드를 찾기 위해서 만든 자료구조