코드보시면서 공부에 도움이 됐으면 좋겠습니다
코드확인해주세요!
더보기
#include <stdio.h>
#include <stdlib.h>
typedef char ElementType;
typedef struct tagNode
{
ElementType data;
struct tagNode* leftChild; // 자식노드
struct tagNode* rightSibling; // 형제노드
} Node;
Node* CreateNode(ElementType newData);
void DestroyNode(Node* node);
void DestroyTree(Node* root);
void AddChildNode(Node* parent, Node* child);
void PrintLevel(Node* node, int level);
void PrintTree(Node* node, int depth);
//노드를 생성
Node* CreateNode(ElementType newData)
{
Node* newNode = (Node*) malloc(sizeof(Node));//노드 생성
newNode->data = newData;
newNode->leftChild = NULL;
newNode->rightSibling = NULL;
return newNode;
}
//노드 파괴
void DestroyNode(Node* node)
{
free(node);
}
//트리를 파괴하는 재귀함수
void DestroyTree(Node* root)
{
if(root->rightSibling != NULL)// 루트의 형제가 존재한다면 형제를 파괴
DestroyTree(root->rightSibling);
if(root->leftChild != NULL)//루트의 자식이 존재한다면 자식을 파괴
DestroyTree(root->leftChild);
root->rightSibling = NULL;
root->leftChild = NULL;
DestroyNode(root);
}
//자식노드추가
void AddChildNode(Node* parent, Node* child)
{
if(parent->leftChild == NULL)// 부모의 자식 노드가 존재하지 않는다면 추가
parent->leftChild = child;
else {
Node* tempNode = parent->leftChild; //// 부모의 자식 노드가 존재한다면
/ 자식 노드의 형제 노드에 연결
while(tempNode->rightSibling != NULL)
tempNode = tempNode->rightSibling;
tempNode->rightSibling = child;
}
}
// 특정레벨출력
void PrintLevel(Node* node, int level) {//루트 /깊이
int depth = 0;
Node* tempChild = node;
Node* tempParent = node;
while(depth <= level)// 레벨에 도달할때까지 반복
{
if(depth == level)// 만약 해당 레벨의 노드가 존재한다면
{
while(tempChild != NULL)
{
printf("%c ", tempChild->data);
// 데이터를 출력하고 형제 노드로 이동
tempChild = tempChild->rightSibling;
}
if(tempParent->rightSibling != NULL)
// 부모 노드의 형제 노드가 존재한다면
{
tempParent = tempParent->rightSibling;
// 그 노드의 자식 노드들도 출력
tempChild = tempParent->leftChild;
}
else// 부모 노드의 형제 노드가 존재하지 않으면 종료
break;
}
else// 깊이와 레벨이 맞지 않으면
{
tempParent = tempChild;// 부모노드를 저장하고
tempChild = tempChild->leftChild;// 한단계 내려간다.
depth++;
}
}
printf("\n");
}
//트리를 재귀함수를 이용하여 출력
void PrintTree(Node* node, int depth) {
int i = 0;
for(i = 0; i < depth; i++) //깊이만큼 띄어쓰기
printf(" ");
printf("%c\n", node->data);
if(node->leftChild != NULL)//자식만저 출력
PrintTree(node->leftChild, depth + 1);//깊이를 하나씩 증가시키며 출력
if(node->rightSibling != NULL)//이웃 출력
PrintTree(node->rightSibling, depth);
}
void main()
{
int i = 0;
Node* root = CreateNode('A'); // 노드 생성
Node* B = CreateNode('B');// 하위 노드 생성
Node* C = CreateNode('C');
Node* D = CreateNode('D');
Node* E = CreateNode('E');
Node* F = CreateNode('F');
Node* G = CreateNode('G');
Node* H = CreateNode('H');
Node* I = CreateNode('I');
Node* J = CreateNode('J');
Node* K = CreateNode('K'); // 트리에 노드 추가
AddChildNode(root, B);//A에대한
AddChildNode(B, C);
AddChildNode(B, D);
AddChildNode(D, E);
AddChildNode(D, F);
AddChildNode(root, G);//A에대한
AddChildNode(G, H);
AddChildNode(root, I);//A에대한
AddChildNode(I, J);
AddChildNode(J, K);
PrintTree(root, 0); // 트리 출력
for(i = 0; i < 4; i++) // 해당 레벨의 노드 출력
{
printf("\nLevel : %d\n", i);
PrintLevel(root, i);
}
DestroyTree(root); // 트리 파괴
}
더 많은 C언어 글이 궁금하다면?
https://chuinggun.tistory.com/category/C%EC%96%B8%EC%96%B4
'C언어' 카테고리의 다른 글
[C언어] 덧셈 뺄셈 나눗셈 곱셈을 실행하는 계산기 프로그램을 작성하시오 (0) | 2022.12.04 |
---|---|
[C언어] 이진트리 전위순회법, 중위순회법, 후위순회법을 작성하시오 (0) | 2022.12.03 |
[C언어] 2진탐색트리 이진탐색트리를 작성하시오 (0) | 2022.12.03 |
[C언어] 단순연결리스트를 작성하시오 (0) | 2022.12.03 |
[C언어] 연결리스트를 연산하는 프로그램을 작성하세요 (0) | 2022.12.03 |
댓글