반응형
//이진 트리 탐색  
#include<stdio.h>
#include<stdlib.h>

typedef struct Node
{
	Node* Left;
	Node* Right;
	int Data;
} Node;

Node* createNode(int data)
{
	Node* newNode = (Node*)malloc(sizeof(Node));
	newNode->Left = NULL;
	newNode->Right = NULL;
	newNode->Data = data;
	
	return newNode;
}

Node* searchNode(Node* Tree, int findData)
{
	if (Tree == NULL) return NULL;
	if (Tree->Data == findData)
		return Tree;
	else if(Tree->Data > findData)
		searchNode(Tree->Left, findData);
	else
		searchNode(Tree->Right, findData);
}

void insertNode(Node* Tree, Node* newNode)
{
	if(newNode->Data > Tree->Data)
	{
		if (Tree->Right != NULL) insertNode(Tree->Right, newNode);
		else Tree->Right = newNode;
	}
	else if(newNode->Data < Tree->Data)
	{
		if (Tree->Left != NULL)insertNode(Tree->Left, newNode);
		else Tree->Left =  newNode;
	}	
}

Node* findMinNode(Node* Tree)
{
	if(Tree==NULL) return NULL;
	if(Tree->Left !=NULL) return findMinNode(Tree->Left);
	else return Tree;
}

Node* removeNode(Node* Tree, int data)
{
	Node* tempNode;
	if(Tree==NULL) printf("해당하는 노드를 찾을 수 없습니다.\n");
	else if(Tree->Data > data) Tree->Left = removeNode(Tree->Left, data);
	else if(Tree->Data < data) Tree->Right = removeNode(Tree->Right, data);
	else
	{
		if(Tree->Left !=NULL && Tree->Right !=NULL)
		{
			tempNode = findMinNode(Tree->Right);
			Tree->Data = tempNode->Data;
			
			Tree->Right = removeNode(Tree->Right, tempNode->Data);
		}
		else 
		{
			tempNode = Tree;
			if (Tree->Left == NULL) Tree = Tree->Right;
			else if (Tree->Right == NULL) Tree = Tree->Left;
			free(tempNode);
		}
	}
	return Tree;
}

void printTree(Node* Tree)
{
	if(Tree == NULL) return;
	printTree(Tree->Left);
	printf("%d ", Tree->Data);
	printTree(Tree->Right);
}

int main()
{
	Node* Tree = createNode(8);
	Node* findNode;
	int input;
	
	insertNode(Tree, createNode(3));
	insertNode(Tree, createNode(2));
	insertNode(Tree, createNode(5));
	insertNode(Tree, createNode(10));
	insertNode(Tree, createNode(14));
	insertNode(Tree, createNode(11));
	insertNode(Tree, createNode(16));
	
	while(1)
	{
		scanf("%d", &input);
		findNode = searchNode(Tree, input);
		
		if(findNode != NULL)
		{
			printf("해당 노드를 찾았습니다! 노드를 제거합니다. 노드의 위치는 %#x 입니다.\n ", findNode);
			removeNode(Tree, input);
			{
				printf("현재 트리 출력 :");
				printTree(Tree); printf("\n"); 	
			}
		}
		else printf("노드를 찾을 수 없습니다. \n");
	}
	return 0;
}
/*
10
해당 노드를 찾았습니다! 노드를 제거합니다. 노드의 위치는 0x151410 입니다.
 현재 트리 출력 :1 5 6 14 17 21
1
해당 노드를 찾았습니다! 노드를 제거합니다. 노드의 위치는 0x151450 입니다.
 현재 트리 출력 :5 6 14 17 21
5
해당 노드를 찾았습니다! 노드를 제거합니다. 노드의 위치는 0x151430 입니다.
 현재 트리 출력 :6 14 17 21
14
해당 노드를 찾았습니다! 노드를 제거합니다. 노드의 위치는 0x151410 입니다.
 현재 트리 출력 :6 17 21
17
해당 노드를 찾았습니다! 노드를 제거합니다. 노드의 위치는 0x151410 입니다.
 현재 트리 출력 :6 21
21
해당 노드를 찾았습니다! 노드를 제거합니다. 노드의 위치는 0x151410 입니다.
 현재 트리 출력 :6
--------------------------------
Process exited after 14.78 seconds with return value 3221225725
계속하려면 아무 키나 누르십시오 . . .
*/
반응형

'2019~2020 > 자료구조' 카테고리의 다른 글

연결 리스트 DFS (c)  (0) 2019.08.16
그래프의 탐색  (0) 2019.08.12
별 출력 수  (0) 2019.06.14
재귀 알고리즘을 사용한 이진 트리 순회  (0) 2019.06.11
n*n 배열에 저장하여 출력하기  (0) 2019.06.05

+ Recent posts