[알고리즘] 이진 트리

이진 트리 🌲

모든 노드가 2개의 서브 트리를 가지고 있는 트리를 이진 트리(binary tree) 라고 부른다.


🍳 이진 트리의 성질
  1. n개의 노드를 가진 이진 트리는 n-1개의 간선을 가진다.
  2. 높이가 h인 이진 트리의 경우, 최소 h개의 노드를 가지며 최대 2^h - 1 개의 노드를 가진다.
  3. n개의 노드를 가지는 이진트리의 높이는 최대 n이거나 최소 log2(n+1)이 된다. (2는 밑)


1. 이진 트리의 표현

🍔 배열 표현법

image

🍔 링크 표현법

image

class Node {
    Object data;
    Node left, right;
    public Node(Object data) {
        this.data = data;
    }
}



2. 이진 트리의 순회

image

🥨 전위 순회 (preorder traversal)

V -> L -> R

void preorder(Node root) {
	System.out.print(root.data);
	if (root.left != null) {
		preorder(root.left);
	}
    if (root.right != null) {
        preorder(root.right);
    }
}


🥨 중위 순회 (inorder traversal)

L -> V -> R

void inorder(Node root) {
    if (root.left != null) {
        inorder(root.left);
    }
    System.out.print(root.data);
    if (root.right != null) {
        inorder(root.right);
    }
}


🥨 후위 순회 (postorder traversal)

L -> R -> V

void postorder(Node root) {
    if (root.left != null) {
        postorder(root.left);
    } 
    if (root.right != null) {
        postorder(root.right);
    }
    System.out.print(root.data)
}



3. 이진 트리 삽입

// 데이터가 1 1 . 의 형식으로 들어온다고 가정
// .은 연결된 노드가 없다는 뜻임
class Tree {
    Node root;
    void add(Object data, Object leftData, Object rightData) {
        if (root == null) {
            if (data != '.') {
                root = new Node(data);
            }
            if (leftData != '.') {
                root.left = new Node(data);
            }
            if (rightData != '.') {
                root.right = new Node(data);
            }
        }
        else {
            search(root, data, leftData, rightData);
        }
    }
    
    void search(Node root, Object data, Object leftData, Object rightData) {
        if (root == null) {
            return ;
        }
        else if (root.data == data) {
            if (leftData != '.') {
                root.left = new Node(leftData);
            }
            if (rightData != '.') {
                root.right = new Node(rightData);
            }            
        }
        else {
            search(root.left, data, leftData, rightData);
            search(root.right, data, leftData, rightData);
        }
    }
}