다음 레벨로 넘어가기전에 같은 레벨에 있는 모든 노드들을 거쳐가는것!(자식 노드들을 보기전에 형제 노드들을 먼저 본다.)
BFS(){ if(!this.root) return false let visited = [], queue = [], node = this.root queue.push(node) while(queue.length){ node = queue.shift() visited.push(node.val) // queue에 push해주어 수평 레벨에 대한 노드를 넣어준다. if(node.left) queue.push(node.left) if(node.right) queue.push(node.right) } return visited }
형제 노드로 넘어가기전에 수직으로 트리의 끝까지 내려간다.
root => left => right
1. 방문한 노드를 저장할 visited 변수와 현재 노드를 가르키는 current변수를 생성한다.
2. current을 인자로 받는 헬퍼 함수를 생성한다(traverse(node))
3. visited에 인자로 받은 node를 넣어준다.
4. node.left가 있다면 node.left값으로 헬퍼함수를 실행해준다.
5. node.right가 있다면 node.right값으로 헬퍼함수를 실행해준다.
6. return visited
DFSPreOrder(){ let visited = [], current = this.root function traverse(node){ visited.push(node.val) if(node.left) traverse(node.left) if(node.right) traverse(node.right) } traverse(this.root) return visited }
left => right => root
DFSPostOrder(){ let visited=[], current = this.root function traverse(node){ if(node.left) traverse(node.left) if(node.right) traverse(node.right) visited.push(node.val) } traverse(current) return visited }
left => root => right
DFSInOrder(){ let visited=[], current = this.root function traverse(node){ if(node.left) traverse(node.left) visited.push(node.val) if(node.right) traverse(node.right) } traverse(current) return visited }
시간 복잡도는 같기 때문에 트리의 구조에 따라 무엇을 사용할지 정한다.