#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable : 4996)
#define ARR_SIZE 9
typedef struct treeNode
{
int value;
struct treeNode* left;
struct treeNode* right;
}treeNode;
treeNode* createBinaryTree(int* arr, int parentIdx, int maxSize);
void displayInorder(treeNode* t);
void displayPreorder(treeNode* t);
void displayPostorder(treeNode* t);
void memoryFree(treeNode* t);
int getSumTreeNode(treeNode* t);
int getCountTreeNode(treeNode* t);
int searchKValue(treeNode* t, int k);
void fun()
{
static int a = 0;
a++;
printf("%d\n", a);
}
int main()
{
fun();
fun();
fun();
int arr[ARR_SIZE]= {6, 4, 8, 2, 5, 7, 9, 1, 3};
treeNode* root = NULL;
root = createBinaryTree(arr, 0, ARR_SIZE);
printf("중위 순회 출력: ");
displayInorder(root);
puts("");
printf("전위 순회 출력: ");
displayPreorder(root);
puts("");
printf("후위 순회 출력: ");
displayPostorder(root);
puts("");
printf("노드의 합은 %d입니다.\n", getSumTreeNode(root));
printf("노드의 개수는 %d입니다.\n", getCountTreeNode(root));
int k;
printf("중위 순회 시 몇 번째 노드의 값을 출력 하시겠습니까? ");
scanf("%d", &k);
printf("중위 순회시 %d번째 노드의 값은 %d입니다.\n", k, searchKValue(root, k));
memoryFree(root);
return 0;
}
treeNode* createBinaryTree(int* arr, int parentIdx, int maxSize)
{
int leftIdx = 2 * parentIdx + 1;
int rightIdx = leftIdx + 1;
treeNode* newNode;
newNode = (treeNode*)malloc(sizeof(treeNode));
newNode->value = arr[parentIdx];
newNode->left = NULL;
newNode->right = NULL;
if(leftIdx < maxSize)
newNode->left = createBinaryTree(arr, leftIdx, maxSize);
if(rightIdx < maxSize)
newNode->right = createBinaryTree(arr, rightIdx, maxSize);
return newNode;
}
void displayInorder(treeNode* t)
{
if (t != NULL)
{
displayInorder(t->left);
printf("%d ", t->value);
displayInorder(t->right);
}
}
void displayPreorder(treeNode* t)
{
if (t != NULL)
{
printf("%d ", t->value);
displayPreorder(t->left);
displayPreorder(t->right);
}
}
void displayPostorder(treeNode* t)
{
if (t != NULL)
{
displayPostorder(t->left);
displayPostorder(t->right);
printf("%d ", t->value);
}
}
void memoryFree(treeNode* t)
{
if (t != NULL)
{
memoryFree(t->left);
memoryFree(t->right);
printf("%d노드 제거\n", t->value);
free(t);
}
}
int getSumTreeNode(treeNode* t)
{
static int sum = 0;
int sum1 = 0, sum2 = 0;
if (t != NULL)
{
return getSumTreeNode(t->left) + getSumTreeNode(t->right)+ t->value;
}
return 0;
}
int getCountTreeNode(treeNode* t)
{
static int count = 0;
if (t != NULL)
{
getCountTreeNode(t->left);
getCountTreeNode(t->right);
++count;;
}
return count;
}
int searchKValue(treeNode* t, int k)
{
static int count = 0;
int result;
if (t != NULL)
{
result = searchKValue(t->left, k);
if(result != -1)
return result;
++count;
if(count == k)
return t->value;
return searchKValue(t->right, k);
}
return -1;
}