#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct treeNode {
int data;
struct treeNode* left;
struct treeNode* right;
} treeNode;
treeNode* find; //순회를 통해 찾은 노드의 주소를 저장할 포인터
treeNode* insertFirstNode(treeNode* p, int x) // 처음 트리를 만들 때 사용할 함수
{
treeNode* newNode;
if (p == NULL) {
newNode = (treeNode*)malloc(sizeof(treeNode));
newNode->data = x;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
}
treeNode* insertLeftNode(treeNode* p, int x) // 트리의 좌측 차일드에 연결하고 값을 저장
{
treeNode* newNode;
newNode = (treeNode*)malloc(sizeof(treeNode));
newNode->data = x;
newNode->left = NULL;
newNode->right = NULL;
p->left = newNode;
}
treeNode* insertRightNode(treeNode* p, int x) // 트리의 오른쪽 차일드에 연결하고 값을 저장
{
treeNode* newNode;
newNode = (treeNode*)malloc(sizeof(treeNode));
newNode->data = x;
newNode->left = NULL;
newNode->right = NULL;
p->right = newNode;
}
treeNode* isvalid(treeNode* root)
{
if (root == NULL) return NULL;
}
//이진탐색트리가 아닌 이진트리에서 원소의 탐색은 순회를 이용한다. 순회는 세 종류 중 아무것이나 사용 가능.
//나는 전위순회를 사용했다.
void preorder(treeNode* p,int val) //전위순회
{
if (p != NULL)
{
if (val == p->data) find = p; // 원하는 값을 찾았을 때 find 포인터에 저장
preorder(p->left,val);
preorder(p->right,val);
}
}
void inorder(treeNode* p)
{
if (p != NULL)
{
inorder(p->left);
printf(" %d", p->data);
inorder(p->right);
}
} //중위 순회
void postorder(treeNode* p)
{
if (p != NULL)
{
postorder(p->left);
postorder(p->right);
printf(" %d", p->data);
}
} // 전위 순회
treeNode* searchNode(treeNode* root, int data) // 원하는 값을 가진 트리 루트 주소를 찾는 순환 함수
{
if (root == NULL) return;
if (root->data == data)
{
preorder(root,data);
}
else
{
searchNode(root->left, data);
searchNode(root->right, data);
}
}
treeNode* insertNode(treeNode* root, int leftN, int rightN)
{
if(leftN != 0) insertLeftNode(root, leftN);
if (rightN !=0)insertRightNode(root, rightN);
}
int main()
{
int treeN;
int rootN, leftN, rightN;
treeNode* root = NULL;
treeNode* p = NULL;
scanf("%d", &treeN);
getchar();
for (int i = 0; i < treeN;i++)
{
scanf("%d %d %d", &rootN, &leftN, &rightN);
getchar();
if (i == 0)
{
root = insertFirstNode(root, rootN);
insertNode(root, leftN, rightN);
}
else
{
searchNode(root, rootN);
insertNode(find, leftN, rightN);
}
}
int searchN;
char c[100];
int k = 0;
scanf("%d", &searchN);
getchar();
for (int i = 0; i < searchN;i++)
{
scanf("%s", c);
getchar();
k = 0;
p = root;
printf("%d", p->data);
while (c[k] != NULL)
{
if (c[k] == 'R')
{
p = p->right;
printf(" %d", p->data);
}
else if (c[k] == 'L')
{
p = p->left;
printf(" %d", p->data);
}
k++;
}
}
return 0;
}
[ 문제 1 ] 위에서 설명한 방식대로 트리 정보와 탐색 정보가 주어졌을 때, 트리를 생성하고 탐색 도중 방문하는 노드의 번호를 차례로 출력하는 프로그램을 작성하시오.