트리(Tree)

사실 중요한건 이진탐색트리다. 책에도 이진탐색트리만 나온다. 이진 탐색트리에 대한 완벽한 이해와 활용이 이번학기 자료구조 및 알고리즘 최종목표 중 하나다.

그전에 나에겐 한가지 문제가 있다. 자료구조와 재귀가 머리속에서 바로 연상되지 않는다. 요문제를 트리를 공부하며 꼭 해결해보자! 일단 다행인건 내가 트리가 뭔지는 안다는 것이다. 복습겸 이진탐색트리를 js로 만들어보자.

function Node(data){
    this.data = data;
    this.left = null;
    this.right = null;
}

Node.prototype.show = function(){
    return this.data
}

function BST(){
    this.root = null;
}

BST.prototype.insert = function(data){
    if(this.root === null){
        this.root = new Node(data)
    }else{
        var current = this.root
        var parent
        while(true){
            //크면 오른쪽
            parent = current
            if(current.data < data){
                current = current.right
                if(current === null){
                    parent.right = new Node(data)
                    break;
                }
            //작으면 왼쪽
            }else{
                current = current.left
                if(current === null){
                    parent.left = new Node(data)
                    break;
                }
            }
        }
    }
}

var bst = new BST()

BST에는 전위,중위,후위라는 세가지 탐색방법이 있다(.....?..뭐??)

  • 전위탐색에서는 먼저 루트노드를 방문한다음 루트의 왼쪽자식을 중심으로 서브트리를 같은방식으로 탐색하며(이것은 깊이우선탐색과 같은말 같다.) 마지막으로 루트노드의 오른쪽 자식을 중심으로 서브트리를 탐색한다.
function preOrder(node){
    if(node !== null){
        console.log(node.data)
        preOrder(node.left)
        preOrder(node.right)
    }
}
  • 중위탐색은 노드의 오름차순 키값으로(즉 젤왼쪽부터 올라옴) BST클래스의 모든 노드를 탐색한다. 재귀를 쓰는군요 역시
function inOrder(node){
    if(node !== null){
        inOder(node.left)
        console.log(node.data)
        inOrder(node.right)
    }
}
//역시 재귀가 잘 안떠오른다. 피보나치때랑 비슷한느낌.
  • 후위탐색은 루트노드의 왼쪽자식을 중심으로 서브트리를 먼저방문한 다음 루트노드의 오른쪽자식을 중심으로하는 서브트리를 방문하며 마지막으로 루트노드를 방문한다.? 존나 하나도 이해안됨.
function postOrder(node){
    if(node !== null){

        preOrder(node.left)
        preOrder(node.right)
        console.log(node.data)
    }
}

대충은 이해함. 낼도 이해하길 하늘에 허락을 구해본다.

results matching ""

    No results matching ""