알고리즘 - 자료구조(9)

1 분 소요

이진 트리(Binary Tree)

  • 모든 노드의 차수가 2 이하인 트리
  • 루트 노드의 서브트리들 전부 이진 트리이며, 그 서브트리의 서브트리들 또한 전부 이진 트리이기 때문에 재귀적 성질을 가지고 있다.
  • size() : 현재 트리에 포함되어 있는 노드의 수를 구함
  • depth() : 현재 트리의 깊이를 구함
  • traverse() : 트리의 각 노드들을 정해진 순서에 따라 순회

    • 깊이 우선 순회(depth first traversal)

      • 중위 순회(in-order traversal) : (1) left subtree -> (2) 자기자신 -> (3) right subtree

      • 전위 순회(pre-order traversal) : (1) 자기자신 -> (2) left subtree -> (3) right subtree

      • 후위 순회(post-order traversal) : (1) left subtree -> (2) right subtree -> (3) 자기자신

    • 넓이 우선 순회(breadth first traversal)

구현

class Node:
    def __init__(self, item):
        self.data = item
        self.left = None
        self.right = None

    def size(self):  # 자신이 루트노드인 서브트리의 사이즈
        leftSize = self.left.size() if self.left else 0
        rightSize = self.right.size() if self.right else 0
        return leftSize + rightSize + 1

    def depth(self):  # 자신이 루트노드인 서브트리의 깊이
        leftDepth = self.left.depth() if self.left else 0
        rightDepth = self.right.depth() if self.right else 0
        return leftDepth + 1 if leftDepth > rightDepth else rightDepth + 1

    def inOrder(self):  # 자신이 루트노드인 서브트리의 중위 순회
        traversal = []
        if self.left:
            traversal += self.left.inOrder()
        traversal.append(self.data)
        if self.right:
            traversal += self.right.inOrder()
        return traversal

    def preOrder(self):  # 자신이 루트노드인 서브트리의 전위 순회
        traversal = []
        traversal.append(self.data)
        if self.left:
            traversal += self.left.preOrder()
        if self.right:
            traversal += self.right.preOrder()
        return traversal

    def postOrder(self):  # 자신이 루트노드인 서브트리의 후위 순회
        traversal = []
        if self.left:
            traversal += self.left.postOrder()
        if self.right:
            traversal += self.right.postOrder()
        traversal.append(self.data)
        return traversal


class BinaryTree:
    def __init__(self, r):
        self.root = r

    def size(self):
        return self.root.size() if self.root else 0

    def depth(self):
        return self.root.depth() if self.root else 0

    def inOrder(self):
        return self.root.inOrder() if self.root else []

    def preOrder(self):
        return self.root.preOrder() if self.root else []

    def postOrder(self):
        return self.root.postOrder() if self.root else []

    def breadthFirstOrder(self):  # 큐 활용
        if self.root == None:
            return []
        queue = ArrayQueue()
        queue.enqueue(self.root)  # Node가 들어옴
        traversal = []
        while queue.size() != 0:
            node = queue.dequeue()
            traversal.append(node.data)
            if node.left:
                queue.enqueue(node.left)
            if node.right:
                queue.enqueue(node.right)
        return traversal


class ArrayQueue:

    def __init__(self):
        self.data = []

    def size(self):
        return len(self.data)

    def isEmpty(self):
        return self.size() == 0

    def enqueue(self, item):
        self.data.append(item)

    def dequeue(self):
        return self.data.pop(0)

    def peek(self):
        return self.data[0]

카테고리:

업데이트:

댓글남기기