dew's CSE Studying

8.10 스레드이진트리 순회 프로그램 본문

2-2/자료구조

8.10 스레드이진트리 순회 프로그램

dew₍ᐢ.ˬ.⑅ᐢ₎ 2023. 11. 15. 18:49
//스레드 이진 트리 순회 프로그램
#include <stdio.h>
#define TRUE 1
#define FALSE 0

typedef struct TreeNode {
	int data;
	struct TreeNode* left, * right;
	int is_thread; //만약 오른쪽 링크가 스레드이면 TRUE
}TreeNode;
//      G
//   C     F
// A     B D E
TreeNode n1 = { 'A',NULL,NULL, 1};
TreeNode n2 = { 'B',NULL,NULL, 1};
TreeNode n3 = { 'C',&n1,&n2,0};
TreeNode n4 = { 'D',NULL,NULL,1};
TreeNode n5 = { 'E',NULL,NULL,0 };
TreeNode n6 = { 'F',&n4,&n5, 0};
TreeNode n7 = { 'G',&n3,&n6, 0 };
TreeNode* exp = &n7;

//중위후속자를 반환하는 함수
TreeNode* find_succesor(TreeNode* p)
{
	//q는 p의 오른쪽 포인터
	TreeNode* q = p->right;
	//만약 오른쪽 포인터가 NULL이거나 스레드이면 오른쪽 포인터를 반환
	if (q == NULL || p->is_thread == TRUE)
		return q;

	//만약 오른쪽 자식이면 다시 왼쪽 노드로 이동
	while (q->left != NULL)
		q = q->left;
	return q;
}

//중위 순회를 하는 함수
void thread_inorder(TreeNode* t)
{
	TreeNode* q;

	q = t;
	while (q->left)
		q = q->left; //가장 왼쪽 노드로 간다
	do {
		printf("%c -> ", q -> data);//데이터 출력
		q = find_succesor(q);//중위후속자를 찾는 코드를 호출
	} while (q); //왼쪽자식이 NULL이 아닌 동안
}


int main(void)
{
	//스레드 설정
	n1.right = &n3;
	n2.right = &n7;
	n4.right = &n6;

	//중위순회
	thread_inorder(exp);
	printf("\n");

	return 0;

}

'2-2 > 자료구조' 카테고리의 다른 글

9.5 히프 정렬 프로그램  (0) 2023.11.16
9.4 히프의 구현(히프트리 전체 함수)  (0) 2023.11.16
8.4 이진트리의 순회  (0) 2023.11.15
4장 연습문제 #10, #11, #12  (2) 2023.10.21
6장 LAB 문제풀이  (2) 2023.10.20