Tree는 이름처럼 나무가 뿌리를 내리는듯한 구조로 되어있다.
트리 중 가장 최상위에 위치한 Node를 Root Node라고 부른다.
function tree(value){
this.value = value;
this.children = [];
}
function binaryTreeNode(value) {
this.value = value;
this.left = null;
this.right = null;
}
function binaryTree(){
this.root = null;
}
선순위 순회는 root(현재 node) -> 왼쪽 -> 오른쪽순으로 진행된다.
function preOrderIteration(){
// 빈 스택에 루트 추가
let nodeStack = [];
nodeStack.push(this.root);
// 모든 항목 하나씩 출력
while(nodeStack.length){
// 스택 최상위 항목 꺼내서 출력
let node = nodeStack.pop();
// 꺼낸 노드의 오른쪽, 왼쪽 자식 노드를 스택에 추가
if(node.right)
nodeStack.push(node.right)
if(node.left)
nodeStack.push(node.left)
}
}
중순위 순회는 왼쪽 -> root(현재 node) -> 오른쪽순으로 진행된다.
function inOrderIterate(){
let current = this.root;
let s = [];
let done = false;
while(!done){
if (current !== null) {
s.push(current);
current = current.left;
} else {
if (s.length) {
current = s.pop();
current = current.right;
} else {
done = true;
}
}
}
}
후순위 순회는 왼쪽 -> 오른쪽 -> root(현재(node)순으로 진행된다.
function postOrderIterate() {
let s1 = [], s2 = [];
s1.push(this.root);
// 첫번째 스택 비울때까지 계속 실행
while(s1.length){
const node = s1.pop();
s2.push(node);
// 제거된 항목의 왼쪽과 오른쪽 자식노드를 s1에 추가
if (node.left)
s1.push(node.left);
if (node.right)
s1.push(node.right);
}
// 두번째 스택의 모든 항목 출력
while(s2.length){
const node = s2.pop();
}
}