Tree traversal(트리 순회)
이진 트리를 순회하는 3가지 방법
그래프 탐색
BFS(Breadth-First Search)
DFS(Depth-First Search)
BFS, DFS 예시
// DFS (깊이 우선 탐색 - 재귀 이용)
// 충분히 변형하여 사용하여야 함
public class Solution {
int goalLen;
String ans;
public String barcode(int len) {
this.goalLen = len;
BarcodeNode firstNode = new BarcodeNode("1");
findAns(firstNode);
return ans;
}
// 특정 조건 만족하는 것을 찾을 시, 바로 return
public boolean findAns(BarcodeNode node){
// 현재 노드 조건 충족 확인 / 미충족시, false
if (!node.passCondition()) return false;
// (길이 + 조건 통과시 true, 멤버 변수에 저장)
if (node.info.length() == this.goalLen){
this.ans = node.info;
return true;
}
// 왼쪽 노드 false시, 오른쪽 노드 실행
// 오른쪽 노드 fales시, false
node.makeLowerClass();
if(!findAns(node.left)){
if(!findAns(node.right)){
return false;
}
}
return true;
}
}
// BFS (너비 우선 탐색 - Queue 사용)
public int connectedVertices(int[][] adjaMatrix) {
if (adjaMatrix.length == 1) return 1;
int count = 0; // 초기화
// 현재 탐색중인 queue
Queue<Integer> queue = new LinkedList<>();
// 아직 탐색하지 않은 요소를 가지고 있음
HashSet<Integer> pointSet = new HashSet<>();
for(int i=0; i<adjaMatrix.length; i++){
pointSet.add(i);
}
while (pointSet.size() != 0){ // 탐색하지 않은 요소가 남아있을 때
Integer firstpoint = (Integer) pointSet.toArray()[0]; // 한개 고름
pointSet.remove((Integer) firstpoint); // 탐색하지 않은 요소에서 제거
queue.add(firstpoint); // 현재 탐색할 요소에 등록
while(!queue.isEmpty()){ // 현재 탐색할 요소에 무언가 있을 경우
Integer aPoint = queue.poll(); // 현재 탐색할 거 가져옴
for (int i=0; i < adjaMatrix.length; i++){
// 인접 요소가 있음 && 현재 미탐색
if (adjaMatrix[aPoint][i] == 1 && pointSet.contains(i)){
pointSet.remove((Integer) i); // 현재 탐색안한 대상에서 제외
queue.add(i); // 현재 탐색할 대상에 추가 -> 깊이가 낮은것부터 반복문에 의해 탐색할 예정
}
}
}
count++;
}
return count;
}