dfs (5) // 출력하고 dfs(4)를 호출하는지, dfs(4)를 호출하고 출력하는지 확인하자. dfs(4) dfs(3) dfs(2) dfs(1)
// 재귀함수
public void dfs(int n) {
// 종료 조건
if (n==0) return;
else {
// dfs 위치에 따라 -> 출력되는 순서가 다르다.
// 1. 1-2-3-4-5 출력 (출력 후 호출)
// dfs(n-1);
// System.out.print(n+" ");
// 2. 5-4-3-2-1 출력 (선 출력 후 호출)
System.out.println(n+" ");
dfs(n-1);
System.out.print(n+" ");
dfs(n-1);
}
}
public void dfs(int n) {
// 종료 조건
if (n==0) return;
else {
dfs(n/2);
System.out.print(n%2+" ");
}
}
public int solution(int n) {
dfs(n);
int answer=0;
return answer;
}
dfs(5)
5*dfs(4)
4*dfs(3)
3*dfs(2)
2*dfs(1)
dfs(1)은 1: return
public int dfs(n) {
if n==1: return 1;
else {
return n*dfs(n-1)
}
}
public int dfs(int n) {
// 종료 조건
if (n==1 || n==2) return 1;
else {
return dfs(n-1)+dfs(n-2);
}
}
public int solution(int n) {
int answer=0;
// System.out.println(dfs(n));
// 하나씩 출력
for (int i=1;i<=n;i++) {
System.out.print(dfs(i)+" ");
}
return answer;
}
public class Main4 {
static int arr[]; // class 밑에 전역변수로 배열 생성
...
// 개선된 dfs
// 이미 나온 값을 배열에 기록하면서, 기록된값은 다시 계산 안하게 하기
public int dfs2(int n) {
//
if (arr[n]!=0) {
return arr[n];
}
// 종료 조건
if (n==1 || n==2) return arr[n]=1;
else {
arr[n]=dfs(n-1)+dfs(n-2);
return arr[n];
}
}
...
// Main함수에서는 전역변수로 만든거를 배열에 넣기, 이때 배열+1로 만들기
arr=new int[n+1]
package inflearn.section7_dfs;
// 부분 집합 구하기
// 있다. 없다로 구분하기 (가지치기)
// 필요한 개수 +1 만큼 배열로 만들고 값 넣기
import java.util.*;
public class Main5 {
// static 전역변수
static int n;
static int arr[];
public void dfs(int k) {
// 종료
if (k==n+1) {
// 출력
String temp="";
for (int i=1;i<=n;i++) {
// 1인것만 temp에 넣는다.
if (arr[i]==1) {
temp+=i+" ";
}
}
// 공집합은 제외
if (temp.length()>0) {
System.out.println(temp);
}
}
else {
// 있다.
arr[k]=1;
dfs(k+1);
// 없다.
arr[k]=0;
dfs(k+1);
}
}
public void solution() {
dfs(1);
}
public static void main(String[] args) {
Main5 main=new Main5();
Scanner scan=new Scanner(System.in);
n=scan.nextInt();
arr=new int[n+1];
main.solution();
}
}
전위, 중위, 후위 순회란?
- 부모의 방문 위치에 따라 달라짐
노드 그리기
class Node {
int data;
Node lt,rt;
public Node(int val) {
data=val;
lt=rt=null;
}
}
// Node 넣기
public class Main6 {
Node root;
public int solution() {
int answer=0;
return answer;
}
public static void main(String[] args) {
Main6 main=new Main6();
main.root=new Node(1);
main.root.lt=new Node(2);
main.root.rt=new Node(3);
main.root.lt.lt=new Node(4);
main.root.lt.rt=new Node(5);
main.root.rt.lt=new Node(6);
main.root.rt.rt=new Node(7);
Scanner scan=new Scanner(System.in);
}
}
package inflearn.section7_dfs;
import java.util.*;
class Node {
int data;
Node lt,rt;
public Node(int val) {
data=val;
lt=rt=null;
}
}
public class Main6 {
Node root;
public void dfs(Node root) {
if (root==null) return; // 종료조건
else {
// 전위 순회 - 먼저 중간에 있는거 출력하고 왼쪽부터 끝까지 재귀로 호출한다음에 null 값이면 스택에서 pop
System.out.println(root.data);
dfs(root.lt);
dfs(root.rt);
// 중위 순회 - 왼쪽부터 쭉 들어가다가 null이면 종료하고 데이터 출력 후
dfs(root.lt);
System.out.println(root.data);
dfs(root.rt);
// 후위 순회
dfs(root.lt);
dfs(root.rt);
System.out.println(root.data);
}
}
public static void main(String[] args) {
Main6 main=new Main6();
main.root=new Node(1);
main.root.lt=new Node(2);
main.root.rt=new Node(3);
main.root.lt.lt=new Node(4);
main.root.lt.rt=new Node(5);
main.root.rt.lt=new Node(6);
main.root.rt.rt=new Node(7);
Scanner scan=new Scanner(System.in);
}
}