[자료구조] 이진 트리의 표현 및 순회

2021. 4. 18. 15:38·Major/Data Structure
728x90

1. 배열 표현법

- 이진트리를 완전 이진 트리라고 가정하고 연속적으로 값을 할당한다.

- 인덱스 0은 사용하지 않는다.

- 완전 이진 트리가 아닐 시 기억공간의 낭비가 심하다.

 

1) 특징

- 노드 i의 부모 노드 인덱스 = i/2

- 노드 i의 왼쪽 자식 노드 인덱스 = 2i

- 노드 i의 오른쪽 자식 노드 인덱스 = 2i+1

 

2. 링크 표현법

- 트리에서의 노드가 구조체로 표현되고, 각 노드가 포인터를 가지고 있어서 이 포인터를 이용하여 노드와 노드를 연결하는 방법이다.

- 하나의 노드는 3개의 필드를 가지는데, 왼쪽자식 노드의 포인터, 데이터, 오른쪽 자식의 포인터를 가진다.

 

> 코드 구현

#include <iostream>
using namespace std;

typedef struct TreeNode {
	int data;
	struct TreeNode* left, * right;
}TreeNode;

int main() {
	TreeNode* n1, * n2, * n3;
	n1 = (TreeNode*)malloc(sizeof(TreeNode));
	n2 = (TreeNode*)malloc(sizeof(TreeNode));
	n3 = (TreeNode*)malloc(sizeof(TreeNode));
	n1->data = 10;
	n1->left = n2;
	n1->right = n3;
	n2->data = 20;
	n2->left = NULL;
	n2->right = NULL;
	n3->data = 30;
	n3->left = NULL;
	n3->right = NULL;
	free(n1); free(n2); free(n3);
	return 0;
}

3. 이진 트리의 순회

 

1) 종류

- 전순위 (루트가 제일 앞)

- 중순위 (루트가 중간)

- 후순위 (루트가 제일 뒤)

 

 

2) 순환 알고리즘 코드

#include <iostream>
using namespace std;


typedef TreeNode* tree_pointer;

typedef struct TreeNode {
	int data;
	struct TreeNode* left, * right;
}TreeNode;


void preorder(tree_pointer ptr) {
	if (ptr) {
		printf("%d ", ptr->data);
		preorder(ptr->left);
		preorder(ptr->right);
	}
}

void inorder(tree_pointer ptr) {
	if (ptr) {
		preorder(ptr->left);
		printf("%d ", ptr->data);
		preorder(ptr->right);
	}
}

void postorder(tree_pointer ptr) {
	if (ptr) {
		preorder(ptr->left);
		preorder(ptr->right);
		printf("%d ", ptr->data);
	}
}

- 연결리스트를 이용하여 구현하였다.

 

3) 비순환 알고리즘 코드

> 전체 코드

#include <iostream>

using namespace std;

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

#define N 100
int top = 0; //스택 초기화
tree_pointer stack[N];

void push(tree_pointer* p) {
	if (top < N - 1) {
		stack[++top] = p;
	}
}

TreeNode *pop() {
	tree_pointer p = NULL;
	if (top >= 0) {
		p = stack[top--];
	}
	return p;
}

void inorder2(tree_pointer ptr) {
	while (1) {
		for (; ptr; ptr = ptr->left) {
			push(ptr);
		}
		ptr = pop();
		if (!ptr) break;
		printf("%d ", ptr->data);
		ptr = ptr->right;
	}
}

 

4. 레벨 순회

- 각 노드를 레벨 순으로 검사하는 순회 방법이다.

- 루트 노드의 레벨이 0이고 아래로 내려갈수록 레벨은 증가한다. 

- 동일한 레벨의 경우에는 좌에서 우로 방문한다.

- 큐를 사용한다.

 

 

728x90
저작자표시 비영리 (새창열림)

'Major > Data Structure' 카테고리의 다른 글

[C언어로 쉽게 풀어쓴 자료구조] 02장 순환 - 연습문제  (0) 2021.05.15
[C언어로 쉽게 풀어쓴 자료구조] 02장 순환_개념정리  (0) 2021.05.14
[자료구조] 이진트리의 성질*  (0) 2021.04.18
[자료구조] 연결 리스트  (0) 2021.04.07
[자료구조] 정렬과 탐색(2) - 퀵, 합병, 이진탐색  (0) 2021.03.29
'Major/Data Structure' 카테고리의 다른 글
  • [C언어로 쉽게 풀어쓴 자료구조] 02장 순환 - 연습문제
  • [C언어로 쉽게 풀어쓴 자료구조] 02장 순환_개념정리
  • [자료구조] 이진트리의 성질*
  • [자료구조] 연결 리스트
BeNI
BeNI
코딩하는 블로그
  • BeNI
    코딩못하는컴공
    BeNI
  • 전체
    오늘
    어제
    • Menu (253)
      • My profile (1)
      • 회고 | 후기 (8)
      • Frontend (65)
        • Article (11)
        • Study (35)
        • 프로그래머스 FE 데브코스 (19)
      • Backend (0)
      • Algorithm (58)
        • Solution (46)
        • Study (12)
      • Major (111)
        • C&C++ (23)
        • Java (20)
        • Data Structure (14)
        • Computer Network (12)
        • Database (15)
        • Linux (6)
        • Architecture (3)
        • Lisp (15)
        • OS (1)
        • Security (2)
      • etc (2)
  • 링크

    • 깃허브
    • 방명록
  • 인기 글

  • 최근 댓글

  • 최근 글

  • 태그

    데브코스
    파일처리
    리팩토링
    프로그래머스
    lisp
    자료구조
    백준
    react
    Algorithm
    C++
  • hELLO· Designed By정상우.v4.10.2
BeNI
[자료구조] 이진 트리의 표현 및 순회
상단으로

티스토리툴바