이진트리 알고리즘이다. 그림을 잘 못그려서 대충 그렸다.


            [1]


       [2]        [3]

     

  [4]      [5]


[1]은 루트노드이다. [1]의 왼쪽에는 [2]노드, 오른쪽에는 [3]노드가 있다.

[2]는 [4] [5]의 부모노드이며 [4] [5]는 [2] 노드의 자식노드이다.


노드의 모양은 아래와 같다.


            [2]                     [1]                    [3]

     [left][num][right] <- [left][num][right] -> [left][num][right]


           [4]                     [2]                    [5]

     [left][num][right] <- [left][num][right] -> [left][num][right]




main.c


#include <stdio.h>

#include "tree.h"


int main(){


struct data *p1 = make();

struct data *p2 = make();

struct data *p3 = make();

struct data *p4 = make();

struct data *p5 = make();


// 노드를 생성해주는 부분이다. 5개의 노드를 생성하자


setdata(p1, 1);

setdata(p2, 2);

setdata(p3, 3);

setdata(p4, 4);

setdata(p5, 5);


// 노드에 데이터를 넣어주는 부분이다.


makeleftsub(p1, p2);

makerightsub(p1, p3);

makeleftsub(p2, p4);

makerightsub(p2, p5);


//  노드와 노드를 연결해주는 부분이다.


printf("%d \n", getdata(getleftsub(p1)));

printf("%d \n", getdata(getleftsub(getleftsub(p1))));

printf("%d \n", getdata(getrightsub(getleftsub(p1))));


// 노드를 출력한다.


return 0;

}




tree.c


#include <stdio.h>

#include <stdlib.h>

#include "tree.h"


struct data *make(void){


struct data *node = (struct data *)malloc(sizeof(struct data));  // 노드를 동적할당한다.


node->left = NULL;  // 노드의 왼쪽에 NULL을 넣는다.

node->right = NULL;  // 노드의 오른쪽에 NULL을 넣는다.


return node;  // malloc 주소를 반환한다.

}


void setdata(struct data *a, int num){

a->num = num;  // 노드의 값을 받은 num 값으로 세팅한다.

}


void makeleftsub(struct data *a, struct data *b){


if (a->left != NULL){  // 노드의 왼쪽이 비어있지 않다면 비운다.

a->left = NULL;

}

a->left = b;  // 비운 곳에 b를 넣는다.

}


void makerightsub(struct data *a, struct data *b){


if (a->right != NULL){  // 노드의 오른쪽이 비어있지 않다면 비운다.

a->right = NULL;

}

a->right = b;  // 비운 곳에 b를 넣는다.

}


int getdata(struct data *a){


return a->num;  // 받은 노드를 출력한다.

}


struct data *getleftsub(struct data *a){


return a->left;  // 노드의 왼쪽 노드를 반환한다.

}


struct data *getrightsub(struct data *a){


return a->right;  // 노드의 오른쪽 노드를 반환한다.

}





tree.h


struct data{

struct data *left;

struct data *right;


int num;

};


struct data *make(void);


void setdata(struct data *a, int num);


void makeleftsub(struct data *a, struct data *b);

void makerightsub(struct data *a, struct data *b);


int getdata(struct data *a);


struct data *getleftsub(struct data *a);

struct data *getrightsub(struct data *a);

 

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

[자료구조] 배열로된 테이블  (0) 2019.12.12
[자료구조] 보간탐색 알고리즘  (0) 2019.12.12
[자료구조] 퀵소트  (0) 2019.12.12
[자료구조] 리스트로 된 큐  (0) 2019.12.12
[자료구조] 배열로 된 큐  (0) 2019.12.12
블로그 이미지

ryancha9

https://blog.naver.com/7246lsy

,