본문 바로가기
C언어

[C언어] 트리를 작성하시오

by 이얏호이야호 2022. 12. 3.

코드보시면서 공부에 도움이 됐으면 좋겠습니다

코드확인해주세요!

 

더보기
#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

 

댓글