본문 바로가기
::public/자료구조

스레드 이진트리

by 해맑은욱 2019. 8. 29.

노드의 개수가 n 이면 전체 링크의 수는 2n.

루트를 제외한 n-1 개의 노드가 부모와 연결됨(간선).

2n 중에 n-1 개를 제외한 n+1 개의 링크가 항상 NULL.

 

n+1개의 NULL 링크에 중위 순회 시에 선행 노드인 중위선행자(inorder predecessor)

중위 순회 시에 후속 노드인 위 후속자(inorder successor)를 저장시켜 놓은 트리

 

class ThreadBinNode
{
private:
    int data;
    ThreadBinNode* left;
    ThreadBinNode* right;
public:
    bool bThread;
 
public:
    ThreadBinNode(int value, ThreadBinNode* l, ThreadBinNode* r, bool bTh)
        : data(value), left(l), right(r), bThread(bTh)
    {}
    int getData()
    {
        return data;
    }
    void setRight(ThreadBinNode* r)
    {
        right = r;
    }
    ThreadBinNode* getLeft()
    {
        return left;
    }
    ThreadBinNode* getRight()
    {
        return right;
    }
};
 
 
#include "ThreadBinNode.h"
 
class ThreadBinTree
{
private:
    ThreadBinNode* root;
public:
    ThreadBinTree(): root(NULL)
    {}
    void setRoot(ThreadBinNode* node)
    {
        root = node;
    }
    bool isEmpty()
    {
        return root == NULL;
    }
    // 스레드 방식의 inorder 방문 함수
    void threadInorder()
    {
        if (!isEmpty())
        {
            printf("스레드 이진트리: ");
            ThreadBinNode* q = root;
            
            while (q->getLeft())
            {
                q = q->getLeft();
            }
            do
            {
                printf("%c ", q->getData());
                q = findSuccessor(q);
            } while (q);
            printf("\n");
        }
    }
    // 후속자 함수 호출
    ThreadBinNode* findSuccessor(ThreadBinNode* p)
    {
        ThreadBinNode* q = p->getRight(); // 오른쪽 자식 포인터
 
        // 만약 오른쪽 포인터가 NULL이거나 스레드이면 오른쪽 포인터를 반환
        if (q == NULL || p->bThread) return q;
        // 만약 오른쪽 자식이면 다시 가장 왼쪽 노드로 이동
        while (q->getLeft() != NULL) q = q->getLeft();
        return q;
    }
};
cs

'::public > 자료구조' 카테고리의 다른 글

우선순위 큐(힙)  (0) 2019.09.03
이진 탐색 트리  (0) 2019.09.03
순환  (0) 2019.08.22
LinkedList 구현.  (0) 2019.08.21
LinkedList 만들어 보기.  (0) 2019.06.28