๋ฐ์ํ
BFS (๋๋น ์ฐ์ ํ์)
BFS์ ์ฅ์
- ๋ ธ๋์ ์๊ฐ ์ ๊ณ ๊น์ด๊ฐ ์์ ๊ฒฝ์ฐ ๋น ๋ฅด๊ฒ ๋์ํ ์ ์๋ค.
- ๋จ์ ๊ฒ์ ์๋๊ฐ ๊น์ด ์ฐ์ ํ์(DFS)๋ณด๋ค ๋น ๋ฆ
- ๋๋น๋ฅผ ์ฐ์ ํ์ํ๊ธฐ์ ๋ต์ด ๋๋ ๊ฒฝ๋ก๊ฐ ์ฌ๋ฌ๊ฐ์ธ ๊ฒฝ์ฐ์๋ ์ต๋จ๊ฒฝ๋ก์์ ๋ณด์ฅํ๋ค.
- ์ต๋จ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋ค๋ฉด ์ด๋ ํ ๊ฒฝ๋ก๊ฐ ๋ฌดํํ ๊น์ด์ง๋คํด๋ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๋ฐ๋์ ์ฐพ์ ์ ์๋ค.
BFS์ ๋จ์
- ์ฌ๊ทํธ์ถ์ DFS์๋ ๋ฌ๋ฆฌ ํ์ ๋ค์์ ํ์ํ ์ ์ ๋ค์ ์ ์ฅํด์ผ ํ๋ฏ๋ก ์ ์ฅ๊ณต๊ฐ์ด ๋ง์ด ํ์ํ๋ค.
- ๋ ธ๋์ ์๊ฐ ๋์ด๋๋ฉด ํ์ํด์ผํ๋ ๋ ธ๋ ๋ํ ๋ง์์ง๊ธฐ์ ๋นํ์ค์ ์ด๋ค.
BFS ๊ตฌํ
Queue์ ๋ฃจํธ๋ฅผ ๋ฃ์ด์ฃผ๊ณ , ์๋์ ์์๋ฅผ ๋ฐ๋ณตํ๋ฉด ๋๋ค.
- Queue์์ ํ๋์ ๋ ธ๋๋ฅผ ๊บผ๋ ๋๋ค.
- ํด๋น ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๊ณ , ์ฐจ๋ก๋๋ก ํ์ ์ฝ์ ํฉ๋๋ค.
/* BFS ์ฝ๋ ๊ตฌํ */
public void bfs(Node root) {
Queue<Node> qu = new LinkedList<Node>();
Node temp = root;
qu.add(temp);
while(!qu.isEmpty()){
/* ํ์์ ๋ฝ์์ ๋ฐ๋ก ์ถ๋ ฅ ์ํจ๋ค. */
temp = qu.poll();
System.out.println(temp.value + " -> ");
if(temp.left != null) // temp.left๊ฐ ์์ผ๋ฉด ํ์ ์ถ๊ฐ.
qu.add(temp.left);
if(temp.right != null)
qu.add(temp.right); // temp.right๊ฐ ์์ผ๋ฉด ํ์ ์ถ๊ฐ.
}
}
๋๋ณด๊ธฐ
boolean ๋ฐฐ์ด visit๋ก ํด๋น ๋ ธ๋์ ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋์ง ์ฒดํฌ ํ๋ฉด์ ํ์ํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
/* ๋ด๊ฐ ์ง ์ฝ๋ */
public void bfs(Node node) {
Queue<Node> qu = new LinkedList<Node>();
boolean[] visit = {false,false};
Node temp = this.root;
qu.add(temp);
while(!qu.isEmpty()){
temp = qu.peek(); // qu์์ ํ๋๋ฅผ ๋ฝ๋๋ค.
if(!visit[0]){
if(temp.left != null) {
qu.add(temp.left);
visit[0] = true;
}else{
System.out.print(qu.poll().value + " -> ");
}
}else if(!visit[1]){
if(temp.right != null) {
qu.add(temp.right);
visit[1] = true;
}else{
System.out.print(qu.poll().value + " -> ");
}
}else if(visit[0] && visit[1]){
visit[0] = false;
visit[1] = false;
System.out.print(qu.poll().value + " -> ");
temp = qu.peek();
}
}
}
DFS (๊น์ด ์ฐ์ ํ์)
DFS์ ์ฅ์
- ํ์ฌ ๊ฒฝ๋ก์์ ๋ ธ๋๋ค๋ง ๊ธฐ์ตํ๋ฉด ๋๋ฏ๋ก, ์ ์ฅ ๊ณต๊ฐ์ ์์๊ฐ ๋น๊ต์ ์ ๋ค.
- ๋ชฉํ ๋ ธ๋๊ฐ ๊น์ ๋จ๊ณ์ ์๋ ๊ฒฝ์ฐ ๋น ๋ฅด๊ฒ ๊ตฌํ ์ ์๋ค.
- ๊ตฌํ์ด ๋๋น ์ฐ์ ํ์(BFS) ๋ณด๋ค ๊ฐ๋จํ๋ค.
DFS์ ๋จ์
- ๋จ์ ๊ฒ์ ์๋๋ ๋๋น ์ฐ์ ํ์(BFS) ๋ณด๋ค ๋๋ฆฌ๋ค.
- ๊ฒฐ๊ณผ ๊ฐ์ด ์๋ ๊ฒฝ๋ก์ ๊น์ด ๋น ์ง ๊ฐ๋ฅ์ฑ์ด ์๋ค.
DFS ์ฝ๋ ๊ตฌํ
- ์ค์์ํ(In-order) ๋ฐฉ์๊ณผ ๋์ผ
/* DFS ์ฝ๋ ๊ตฌํ */
public void dfs(Node node) {
if(node != null) {
dfs(node.left);
System.out.println(node.value + " -> ");
dfs(node.right);
}
}
๐ REFERENCES
coding-factory.tistory.com/611?category=794828
coding-factory.tistory.com/612
๋ฐ์ํ