본문 바로가기

삼성전자 알고리즘/자료구조 알고리즘

10. 트리

세그먼트 트리 :

인덱스 구간의 합을 노드에 저장.

리프 노드에는 각 데이터가 저장되어 있음.

#include <stdio.h>
#define NUM_DATA 5
#define MAX_TREE (1<<4)
int segment_tree[MAX_TREE];
int arr[NUM_DATA + 1] = { 0, 10,20,30,40,50 };	//0번 index 공간 무시
void segment_update(int cur_node, int s, int e, int idx, int data) {
	if (s == e) {
		segment_tree[cur_node] = data;
		return 0;
	}
	int m = (s + e) / 2;
	//idx가 m보다 작으면 왼쪽 아니면 오른쪽
	if (idx <= m) segment_update(cur_node * 2, s, m, idx, data);
	else segment_update(cur_node * 2 + 1, m + 1, e, idx, data);
	segment_tree[cur_node] = segment_tree[cur_node * 2] + segment_tree[cur_node * 2 + 1];
}
int query(int cur_node, int s, int e, int q_s, int q_e) {
	if (q_s <= s && e <= q_e) return segment_tree[cur_node];
	if (e < q_s || q_e < s)return 0;
	int m = (s + e) / 2;
	int left_segment = query(cur_node * 2, s, m, q_s, q_e);
	int right_segment = query(cur_node * 2 + 1, m + 1, e, q_s, q_e);
	return left_segment + right_segment;
}

int main(void)
{
	int i;
	for (i = 1; i <= NUM_DATA; i++)
	{
		segment_update(1, 1, NUM_DATA, i, arr[i]);
	}
	printf("Query[1~5] : result = %d\n", query(1, 1, NUM_DATA, 1, 5));
}

'삼성전자 알고리즘 > 자료구조 알고리즘' 카테고리의 다른 글

12. 배열 Array  (0) 2019.05.17
11. B트리 / B+트리 / B*트리  (0) 2019.05.16
9. 스택  (0) 2019.05.16
8. 정렬  (0) 2019.05.14
7. 이진 탐색 [Binary Search]  (0) 2019.05.14