반응형
#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node *left;
struct node *right;
} Node;
// 데이터 삽입(recursion)
void insert(struct node **root, int data) {
struct node* ptr;
struct node* newNode = (struct node*)malloc(sizeof(struct node));
newNode->data = data;
newNode->left = newNode->right = NULL;
if(*root == NULL){
*root = newNode;
return;
}
ptr = *root;
while(ptr){
if(data < ptr->data){
if(ptr->left == NULL){
ptr->left = newNode;
return;
}
else{
ptr = ptr->left;
}
}
else{
if(ptr->right == NULL){
ptr->right = newNode;
return;
}
else{
ptr = ptr->right;
}
}
}
}
// 전위(preorder)탐색(recursion)
void preOrder(struct node *root) {
if(root == NULL) return;
printf("%d ", root->data);
preOrder(root->left);
preOrder(root->right);
}
// 중위(inorder)탐색(recursion)
void inOrder(struct node *root) {
if(root == NULL) return;
inOrder(root->left);
printf("%d ", root->data);
inOrder(root->right);
}
// 후위(postorder)탐색(recursion)
void postOrder(struct node *root) {
if(root == NULL) return;
postOrder(root->left);
postOrder(root->right);
printf("%d ", root->data);
}
// 노드의 개수(recursion)
int size(struct node *root) {
if(root == NULL) return 0;
return 1 + size(root->left) + size(root->right);
}
// 높이(recursion)
int height(struct node *root) {
if(root == NULL) return 0;
if(root->left == NULL && root->right == NULL) return 0;
int leftHeight = height(root->left);
int rightHeight = height(root->right);
return 1 + (leftHeight>= rightHeight ? leftHeight : rightHeight);
}
// 미러 이미지로 변환하기(recursion)
void mirror(struct node **root) {
if(*root == NULL) return;
mirror(&(*root)->left);
mirror(&(*root)->right);
struct node *tmp = (*root)->left;
(*root)->left = (*root)->right;
(*root)->right = tmp;
}
// 노드에 저장된 데이터의 값의 합 구하기(recursion)
int sumOfWeight(struct node *root) {
if(root == NULL) return 0;
return sumOfWeight(root->left) + sumOfWeight(root->right) + root->data;
}
// 루트노드부터 단말노드까지의 경로 상의 데이터의 최대합(recusrion)
int maxPathWeight(struct node *root) {
if(root == NULL) return 0;
int leftWeight, rightWeight;
leftWeight = maxPathWeight(root->left);
rightWeight = maxPathWeight(root->right);
return root->data + (leftWeight>=rightWeight ? leftWeight : rightWeight);
}
// 트리노드의 동적 메모리 해제하기(recursion)
void destruct(struct node **root) {
if(*root == NULL) return;
destruct(&((*root)->left));
destruct(&((*root)->right));
free(*root);
*root = NULL;
}
반응형
'Algorithm > recursion' 카테고리의 다른 글
[recursion] 재귀와 Activation record와 스택 오버플로우 (0) | 2022.09.22 |
---|