쿠릉쿠릉 쾅쾅
쿠릉쿠릉 쾅쾅
쿠릉쿠릉 쾅쾅
250x250
전체 방문자
오늘
어제
  • 분류 전체보기
    • HTML CSS
    • 잡담
    • 프로그래밍 꿀팁 사이트
    • 코딩 도서
    • [자바]
      • 디자인 패턴
      • 자바의 정석 - 3판
      • 자바
      • 자바 문법
    • git
    • [TDD]
    • 개발 서적 독후감
      • 클린 코더
      • 토비 스프링3
      • 객체지향의 사실과 오해
      • 모던 자바 인 액션
      • 엘레강트 오브젝트
    • CS
      • 운영체제
      • HTTP
    • [SQL]
      • SQL 기초
      • 혼자공부하는SQL
    • [ Spring ]
      • REST API
      • Spring Toy
      • Spring 에러
      • Spring
      • Spring 입문
      • Spring 핵심 원리
      • SpringMVC 1편
      • SpringMVC 2편
      • Spring Boot를 이용한 RESTful We..
      • Batch
    • [JPA]
      • JPA
      • JPA 에러
      • JPA 프로그래밍 - 기본편
      • 스프링 부트와 JPA 활용 1 - 웹 애플리케이..
      • 실전! 스프링 부트와 JPA 활용2 - API 개..
      • 실전! 스프링 데이터 JPA
      • 실전! Querydsl
    • 인텔리제이
    • [DB]
      • DB
      • H2
    • Gradle
    • 면접
    • [알고리즘]
      • 알고리즘
      • 자료구조
      • 자바 알고리즘 공부
    • [프로젝트]
    • 쿠릉식 객체지향 사고
    • 리눅스

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • SQL
  • MVC
  • querydsl
  • 자바
  • http
  • 함수형인터페이스
  • Spring
  • springboot
  • 재귀
  • java
  • 스프링
  • 알고리즘
  • 자료구조
  • Git
  • REST API
  • 백준
  • GitHub
  • 스프링부트
  • 깃허브
  • JPA

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
쿠릉쿠릉 쾅쾅

쿠릉쿠릉 쾅쾅

[자료구조] 이진트리 순회(DFS : Depth - First Search)
[알고리즘]/자료구조

[자료구조] 이진트리 순회(DFS : Depth - First Search)

2022. 2. 13. 15:02
728x90

 

깊이 우선 탐색 (DFS)

  • 루트 노드(혹은 임의의 노드)에서 시작해서 다음 분기로 넘어가기 전에 해당 분기를 완벽하게 탐색하는 방법
    • 미로를 탐색할 때 한 방향으로 갈 수 있을때까지 계속 가다가 더 이상 갈 수 없게 되면 다시 가장 가까운 갈림길로 돌아와서 이곳으로부터 다른 방향으로 다시 탐색을 진행하는 방법과 유사하다.
    • 즉, 넓게(wide) 탐색하기 전에 깊게 탐색하는 것이다.
    • 사용하는 경우 : 모든 노드를 방문하고자 하는 경우에 이 방법을 택한다.
    • 깊이 우선 탐색(DFS)이 너비 우선 탐색(BFS)보다 좀 더 간단하다.
    • 깊이 우선 탐색(DFS)의 검색 속도가 너비 우선 탐색에 비해서 느리다.

 

 

 

 

이진트리 순회

 

  • 전위 순회  출력 : 1 2 4 5 3 6 7
    • 루트 - 왼쪽 자식 - 오른쪽 자식
  • 중위 순회 : 4 2 5 1 6 3 7
    • 왼쪽 자식 - 루트 - 오른쪽 자식
  • 후위순회 : 4 5 2 6 7 3 1
    • 왼쪽 자식 - 오른쪽 자식 - 루트 

 

💡 이진 트리 만들기

public  class Solution {
    public static void main (String[] args) {    
    	Node root = new Node(1);
    	root.lt = new Node(2);
    	root.rt = new Node(3);
    	root.lt.lt = new Node(4);
    	root.lt.rt = new Node(5);
    	root.rt.lt = new Node(6);
    	root.rt.rt = new Node(7);
    }
    
    static class Node {
    	int data;
    	Node lt, rt;
    	
    	Node(int data) {
    		this.data = data;
    		lt = rt = null;
    	}
    }
}

 

 

🔍 전위 순회 (PreOrder) Root - L - R

public  class Solution {
    public static void main (String[] args) {    
    	Node root = new Node(1);
    	root.lt = new Node(2);
    	root.rt = new Node(3);
    	root.lt.lt = new Node(4);
    	root.lt.rt = new Node(5);
    	root.rt.lt = new Node(6);
    	root.rt.rt = new Node(7);
    	DFS(root);
    }
    
    static class Node {
    	int data;
    	Node lt, rt;
    	
    	Node(int data) {
    		this.data = data;
    		lt = rt = null;
    	}
    }
    
    static void DFS(Node root) {
    	if(root == null) return;
    	
    	System.out.print(root.data + " ");
    	DFS(root.lt);
    	DFS(root.rt);
    }
}
1 2 4 5 3 6 7

 

 

🔍 중위 순회 (InOrder) L - Root- R

public  class Solution {
    public static void main (String[] args) {    
    	Node root = new Node(1);
    	root.lt = new Node(2);
    	root.rt = new Node(3);
    	root.lt.lt = new Node(4);
    	root.lt.rt = new Node(5);
    	root.rt.lt = new Node(6);
    	root.rt.rt = new Node(7);
    	DFS(root);
    }
    
    static class Node {
    	int data;
    	Node lt, rt;
    	
    	Node(int data) {
    		this.data = data;
    		lt = rt = null;
    	}
    }
    
    static void DFS(Node root) {
    	if(root == null) return;
    	
    	DFS(root.lt);
    	System.out.print(root.data + " ");
    	DFS(root.rt);
    }
}
4 2 5 1 6 3 7

 

 

🔍 후위 순회 (PostOrder) L - R - Root

public  class Solution {
    public static void main (String[] args) {    
    	Node root = new Node(1);
    	root.lt = new Node(2);
    	root.rt = new Node(3);
    	root.lt.lt = new Node(4);
    	root.lt.rt = new Node(5);
    	root.rt.lt = new Node(6);
    	root.rt.rt = new Node(7);
    	DFS(root);
    }
    
    static class Node {
    	int data;
    	Node lt, rt;
    	
    	Node(int data) {
    		this.data = data;
    		lt = rt = null;
    	}
    }
    
    static void DFS(Node root) {
    	if(root == null) return;
    	
    	DFS(root.lt);
    	DFS(root.rt);
    	System.out.print(root.data + " ");
    }
}
4 5 2 6 7 3 1

 

 

 

 


👀 참고 자료

https://gmlwjd9405.github.io/2018/08/14/algorithm-dfs.html

 

[알고리즘] 깊이 우선 탐색(DFS)이란 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

 

728x90

'[알고리즘] > 자료구조' 카테고리의 다른 글

[자료구조] 그래프와 인접행렬  (0) 2022.02.23
[자료구조] 이진 트리 레벨 탐색 (BFS : Breath-First-Search)  (0) 2022.02.22
[자료구조] 순열  (0) 2022.02.17
[자료구조] 부분 집합 구하기 (DFS)  (0) 2022.02.16
[자료구조] 재귀함수  (0) 2022.02.13
    '[알고리즘]/자료구조' 카테고리의 다른 글
    • [자료구조] 이진 트리 레벨 탐색 (BFS : Breath-First-Search)
    • [자료구조] 순열
    • [자료구조] 부분 집합 구하기 (DFS)
    • [자료구조] 재귀함수
    쿠릉쿠릉 쾅쾅
    쿠릉쿠릉 쾅쾅
    깃허브 주소 : https://github.com/kureung

    티스토리툴바