ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Chapter 5-4 : Tree (Binary Search Tree)
    자료구조 2021. 12. 9. 00:57
    728x90

    binary search tree는 우리가 이전에 배운 탐색 알고리즘을 용이하게 하기 위한 자료구조입니다.

    각 root node의 왼쪽은 root node보다 작고 오른쪽은 root node보다 큰 수가 들어가게 되면서

    어떤 수를 찾을 때 root node와 비교해주어 작으면 왼쪽으로가고 크면 오른쪽으로 가면서 탐색을하게 됩니다.

    typedef struct node* tree_pointer;
    typedef struct node {
    	int data;
    	tree_pointer left, right;
    }node;

    다음과 같은  tree 선언을 해줍니다.


    Search (Recursive) 재귀함수

    탐색과정을 재귀적으로 수행하는 방법입니다.

    tree_pointer search(tree_pointer root, int key) {
    	if (!root) return NULL;
    	if (key == root->data) return root;
    	if (key < root->data) //찾는 숫자가 root node보다 작을때
    		return search(root->left, key);
    	return search(root->right, key); //찾는 숫자가 root node보다 클때
    }

    Search (Iterative) 반복

    탐색과정을 반복적으로 수행하는 방법입니다.

    tree_pointer iter_search(tree_pointer tree, int key) {
    	while (tree) {
    		if (key == tree->data)return tree;
    		if (key < tree->data)
    			tree = tree->left;
    		else
    			tree = tree->right;
    	}
    	return NULL; //못찾았을떄
    }

    Inserting Into A Binary Search Tree (삽입)

    먼저 새로운 node를 삽입하기 전에 기존에 tree에 해당 node가 중복되지 않은지 확인해야합니다.

    void insert(tree_pointer* node, int num) {
    	tree_pointer ptr, temp = modified_search(*node, num); //num이 기존tree에 있는지 확인
    	if (temp || !(*node)) { 
    		ptr = (tree_pointer)malloc(sizeof(node));
    		if (IS_FULL(ptr)) {
    			fprintf(stderr, "The memory is full");
    			exif(1);
    		}
    		ptr->data = num;
    		ptr->left = ptr->right = NULL;
    		if (*node)
    			if (num < temp->data)
    				temp->left = ptr;
    			else temp->right = ptr;
    		else *node = ptr;
    	}
    }

    modified_search는 num이 기존 tree에 있는지 확인하고 있으면 NULL을 반환하고, 그게 아니면 tree의 마지막 node pointer를 반환합니다.

     

Designed by Tistory.