- 같은 레벨에 있는 노드들을 먼저 거쳐가야 한다.
- 자식노드를 보기전에 형제노드를 먼저 체크한다. (수평레벨 체크)
배열이나 리스트로 queue를 만들고 Push 생성 unshift 제거
큐를 만들어서 요소를 추적하고,
그 방문한 데이터의 리스트를 만들어 마지막에 출력
function bfs(bst){
let queue=[bst.root]
let visited=[]
//자바스크립트는 빈배열 값을 true로 판단
while(queue.length!==0){
const node = queue.shift();
visited.push(node.value);
if(node.left) queue.push(node.left);
if(node.right) queue.push(node.right);
}
return visited;
}
위의 코드는 자식의 왼쪽 오른쪽 최대 2개의 노드를 가지는 이진트리일 때 이다.
만약 자식이 2개 이상일 경우 해당 부분은 변경해야한다.
class BinarySearchTree{
constructor(){
this.root = null;
}
insert(value){
let newNode = new Node(value);
if(!this.root){
this.root = newNode;
return this
}
let curNode = this.root;
let count=0;
while(curNode){
if(value === curNode.value) return undefiend;
if(value < curNode.value) {
if(curNode.left === null) {
curNode.left = newNode;
return this;
}
curNode = curNode.left
}
else {
if(curNode.right === null) {
curNode.right = newNode;
return this;
}
curNode = curNode.right
}
}
return this;
}
find(value){
if(!this.root) return false;
let curNode = this.root;
while(curNode){
if(curNode.value===value) return true;
if(value<curNode.value) curNode= curNode.left;
else curNode = curNode.right;
}
return false
}
dfs_pre(){
let visited= [];
let current = this.root;
function traverse(node){
visited.push(node.value);
if(node.left) traverse(node.left);
if(node.right) traverse(node.right);
}
traverse(current);
return visited;
}
dfs_post(){
let visited=[];
let current = this.root;
function traverse(node){
if(node.left) traverse(node.left);
if(node.right) traverse(node.right);
visited.push(node.value);
}
traverse(current);
return visited;
}
}
class Node{
constructor(value){
this.value = value;
this.left = null;
this.right= null;
}
}
traverse 헬퍼함수에서 위치만 바꿔주면 전위, 중위, 후위가 된다.
visited [] 나중에 출력시킬 데이터
최상위 노드를 current 변수에 저장
헬퍼함수를 만든다.
function traverse(node){
visited.push(node.value);
if(node.left) traverse(node.left);
if(node.right) traverse(node.right);
}
function traverse(node){
if(node.left) traverse(node.left);
if(node.right) traverse(node.right);
visited.push(node.value);
}