< [C] 이진트리(이진탐색트리X)를 만든 후 탐색

프로그래밍 공부/자료구조

[C] 이진트리(이진탐색트리X)를 만든 후 탐색

Rocketbabydolls 2021. 5. 31. 16:53
#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 ] 위에서 설명한 방식대로 트리 정보와 탐색 정보가 주어졌을 때, 트리를 생성하고 탐색 도중 방문하는 노드의 번호를 차례로 출력하는 프로그램을 작성하시오. 

 

입출력 예시