본문 바로가기
C/자료구조

이진 트리(Binary Tree)

by Glory_Choi 2022. 6. 1.
반응형

이진 트리란?

 

루트 노드를 중심으로 두 개의 서브 트리로 나뉘어 짐.

나뉘어진 두 서브 트리도 모두 이진 트리.

노드가 위치 할 수 있는 곳에 노드가 존재하지 않으면, 공집합 노드가 존재하는 것으로 간주.

 

서브 트리

큰 트리는 작은 트리로 구성이 되는데 이렇듯 큰 트리에 속하는 작은 트리를 서브 트리라 함.

 

포화 이진 트리와 완전 이진 트리

포화 이진 트리

모든 레벨이 꽉 차 있고 노드를 더 추가하려면 레벨을 늘려야 하는 이진 트리.

완전 이진 트리

포화 이진 트리처럼 모든 레벨이 꽉 찬 상태는 아니지만, 차곡차곡 빈틈없이 노드가 채워진 이진 트리를 뜻한다.

 

연결 리스트 기반 이진 트리 구현

 

헤더파일에 정의된 구조체 // 구조체 자체만으로도 공집합 노드 두 개를 갖은 노드이자 트리

typedef struct _bTreeeNode //이진 트리의 노드를 표현한 구조체

{

BTData data; //데이터를 저장할 변수

struct _bTreeNode* left; //왼쪽 서브트리의 주소 값 저장할 포인터 변수

struct _bTreeNode* right; //오른쪽 서브트리의 주소 값 저장할 포인터 변수

}BTreeNode;

 

--BinaryTree.h

 

#ifndef BINARY_TREE_H

#define BINARY_TREE_H

 

typedef int BTData;

 

typedef struct _bTreeeNode

{

BTData data;

struct _bTreeNode* left;

struct _bTreeNode* right;

}BTreeNode;

 

BTreeNode* MakeBTreeNode(void); //노드의 생성

BTData GetData(BTreeNode* bt); //노드에 저장된 데이터를 반환

void SetData(BTreeNode* bt, BTData data); //노드에 데이터를 저장

BTreeNode* GetLeftSubTree(BTreeNode* bt); //왼쪽 서브 트리의 주소 값 반환

BTreeNode* GetRightSubTree(BTreeNode* bt); //오른쪽 서브 트리의 주소 값 반환

void MakeLeftSubTree(BTreeNode* main, BTreeNode* sub);

//왼쪽 서브 트리를 만드는(연결하는 함수)

void MakeRightSubTree(BTreeNode* main, BTreeNode* sub);

//오른쪽 서브 트리를 만드는(연결하는 함수)

 

#endif // !BINARY_TREE_H

 

--BinaryTree.c

 

#include <stdio.h>

#include <stdlib.h>

#include "BinaryTree.h"

 

BTreeNode* MakeBTreeNode(void) //이진 트리의 노드를 생성

{

BTreeNode* nd = (BTreeNode*)malloc(sizeof(BTreeNode)); //노드 생성

nd->left = NULL; //left 포인터 변수 초기화

nd->right = NULL; //right 포인터 변수 초기화

return nd;

}

 

BTData GetData(BTreeNode* bt)

{

return bt->data; //노드에 저장 된 값 반환

}

 

void SetData(BTreeNode* bt, BTData data)

{

bt->data = data; //노드에 데이터 저장

}

 

BTreeNode* GetLeftSubTree(BTreeNode* bt)

{

return bt->left; //왼쪽 서브트리에 저장 된 값 반환

}

 

BTreeNode* GetRightSubTree(BTreeNode* bt)

{

return bt->right; //오른쪽 서브트리에 저장된 값 반환

}

 

void MakeLeftSubTree(BTreeNode* main, BTreeNode* sub)

{

if (main->left != NULL) //메인의 왼쪽에 값이 있으면 값을 지우고

free(main->left);

 

main->left = sub; //서브트리를 메인의 왼쪽과 연결

}

 

void MakeRightSubTree(BTreeNode* main, BTreeNode* sub)

{

if (main->right != NULL) //메인의 오른쪽에 값이 있으면 값을 지우고

free(main->right);

 

main->right = sub; //서브트리를 메인의 오른쪽과 연결

}

 

--BinaryTreeMain.c

 

#include <stdio.h>

#include "BinaryTree.h"

 

int main(void)

{

BTreeNode* bt1 = MakeBTreeNode(); //노드생성

BTreeNode* bt2 = MakeBTreeNode();

BTreeNode* bt3 = MakeBTreeNode();

BTreeNode* bt4 = MakeBTreeNode();

 

SetData(bt1, 1); //값 저장

SetData(bt2, 2);

SetData(bt3, 3);

SetData(bt4, 4);

 

MakeLeftSubTree(bt1, bt2); //서브트리 연결

MakeRightSubTree(bt1, bt3);

MakeLeftSubTree(bt2, bt4);

 

printf("%d \n", GetData(GetLeftSubTree(bt1)));

 

printf("%d \n", GetData(GetLeftSubTree(GetLeftSubTree(bt1))));

 

return 0;

}

 

실행 결과

2

4

 
 
 
//출처 윤성우의 열혈 자료구조
반응형

'C > 자료구조' 카테고리의 다른 글

이진 트리 순회  (0) 2022.06.02
Tree(트리)  (0) 2022.06.01
ArrayList (배열 기반 리스트)  (0) 2022.05.30
재귀  (0) 2022.05.29
자료 구조  (0) 2022.05.29