트 리 구조 (데이터 구조)

6.1 나무의 기본 개념
트 리 구 조 는 선형 구조 와 구별 되 는 또 다른 빅 데이터 구조 로 를 가진다.
나 무 는 n (n > = 0) 개의 결점 으로 구 성 된 유한 집합 이다.n = 0 의 나 무 를 빈 나무 라 고 합 니 다.n! =0 시, 나무의 결점 도 는 다음 과 같은 조건 을 만족 시 켜 야 합 니 다.
  • 있 고 특정한 결점 만 이 뿌리
  • 라 고 부른다.
  • 나머지 결점 은 m (m > = 0) 개 로 나 뉘 어 서로 교차 하지 않 는 유한 집합, T1, T2,............................................
  • 이상 은 재 귀 정의 이다.
  • : 우 리 는 한 결점 이 가 진 자녀 수 를 이 결점 의 도 라 고 부 르 고 나무 중의 모든 결점 도의 최대 치 를 나무의 도 라 고 부른다. : 0 이 라 고 불 리 는 결점 은 단말기 결점 이나 잎 결점 이다. : 0 이 라 고 부 르 지 않 는 결점 은 비 단말기 결점 이나 지점 이다. : 나무 에 두 개의 결점 을 연결 하 는 선분 을 나뭇가지 라 고 한다. : 나무 에서 결점 Ki 부터 나 뭇 가 지 를 따라 위 에서 아래로 결점 kj 에 도달 할 수 있다 면 ki 에서 kj 까지 경로 가 존재 한다 고 합 니 다. 경로 의 길 이 는 지나 간 나뭇가지 수 와 같 습 니 다. : 뿌리 부터 정의 합 니 다. 뿌리 노드 는 1 층 이 고 뿌리의 자녀 노드 는 2 층 을 구성 합 니 다. 이런 식 으로 유추 합 니 다. 만약 에 특정한 노드 kj 가 i 층 에 있 으 면 자녀 는 i + 1 층 에 있 습 니 다. : 나무의 결점 의 최대 층 차 는 나무의 깊이 나 높이 라 고 한다. : 만약 에 나무 에 임의의 결점 이 있 는 나무 가 모두 왼쪽 에서 오른쪽으로 순서 가 있 는 것 으로 보고 임의로 교환 할 수 없 으 면 이 나 무 를 질서 있 는 나무 라 고 부 르 고 그렇지 않 으 면 무질서 한 나무 라 고 부른다. : m (m > = 0) 개의 서로 교차 하지 않 는 나무 로 구 성 된 집합 을 숲 이 라 고 한다. 숲 과 나무의 개념 은 매우 비슷 하 다. 한 나무 에 점 이 있 는 나무 로 구 성 된 몇 개 는 하나의 숲 이 고 숲 속 의 모든 나무 에 하나의 공 통 된 뿌리 를 더 하면 숲 은 하나의 나무 가 된다.
    6.3 나무의 저장 구조
    자주 사용 하 는 나무의 저장 구 조 는 세 가지 가 있 는데 그것 이 바로 부모 표현법, 아이 표현법, 아이 형제 표현법 이다.
    6.3.1 양친 표현법
    나무 에 서 는 뿌리 노드 에 부모 가 없 는 것 을 제외 하고 모든 노드 의 부모 가 유일 하 게 확정 되 어 있 습 니 다. 따라서 나무 에 저 장 된 노드 는 두 가지 정 보 를 포함해 야 합 니 다. 노드 의 값 data 와 노드 간 의 상호 관 계 를 나타 내 는 속성 - 이 노드 의 부모 parent.
    트 리 의 모든 노드 를 1 차원 배열 에 저장 할 수 있 습 니 다.
    #define MAXSIZE 100
    typedef char datatype;
    typedef struct node
    {
         
        datatype data;
        int parent;
    }node;
    typedef struct tree
    {
         
        node treelist[MAXSIZE];
        int length ,root;
    }tree;
    

    6.3.2 아이 표현 법
    아이 표현법 으로 한 그루 의 나 무 를 표시 할 때, 나무의 각 결점 은 자신의 값 을 저장 하 는 것 외 에 도 모든 자녀의 위 치 를 지적 해 야 한다. 각 결점 은 보통 두 개의 영역 을 포함한다. 하 나 는 원소 의 값 영역 data 이 고, 다른 하 나 는 지침 그룹 이다. 배열 의 모든 요 소 는 이 결점 자녀 를 가리 키 는 지침 이다. 하나의 m 도의 수 는 지침 그룹의 크기 가 m 이다.。
    아이 표현법 은 또 세 가지 로 나 뉜 다.
  • 지침 방식 의 아이 표현법
  • 배열 방식 의 아이 표현 법
  • 링크 방식 의 아이 표현 법
  • 1. 포인터 방식 의 아이 표현 법
    #define m 3
    typedef char datatype;
    typedef struct node{
         
        datatype data;
        struct node *child[m];
    }node ,*tree;
    tree root;
    

    2. 배열 방식 의 아이 표현 법
    편리 함 을 찾기 위해 서 트 리 의 모든 노드 를 1 차원 배열 에 저장 할 수 있 습 니 다.
    #define m 3
    #define MAXSIZE 20   /*          */
    typedef char datatype;
    typedef struct node{
         
        datatype data;
        int child[m];
    }treenode;
    treenode tree[MAXSIZE];  /*        */
    int root;   /*       */
    int length;  /*           */
    

    3. 링크 방식 의 아이 표현 법
    모든 노드 의 자녀 를 배열 하여 하나의 단일 체인 표를 형성 하면 n 개의 노드 는 n 개의 단일 체인 표를 형성 하고 n 개의 단일 체인 표 의 머리 지침 은 하나의 선형 표를 구성 하여 찾기 편 의 를 위해 배열 방식 으로 저장 할 수 있다.
    #define MAXSIZE 50
    typedef char datatype;
    typedef struct cnode{
           /*       */
        int child;
        struct chnode *next;
    }chnode,*chpoint;
    typedef struct{
             /*  ,       */
        datatype data;
        chpoint firstchild;
    }node;
    typedef struct {
             /*    */
        node treelist [MAXSIZE];
        int length ,root;
    }tree;
    

    6.3.3 아이 형제 표현법
    즉, 트 리 의 모든 노드 를 저장 할 때 이 노드 값 영역 을 포함 하 는 것 외 에 도 두 개의 포인터 필드 firstchild 와 rightsibling 을 설정 하여 각각 이 노드 의 첫 번 째 키 여자 와 오른쪽 형 제 를 가리 키 는 이 진 링크 방식 으로 저장 하기 때문에 이 방법 은 이 진 트 리 표현 법 이 라 고도 부른다.
    6.4 나무의 옮 겨 다 니 기
    트 리 의 옮 겨 다 니 는 것 은 특정한 순서에 따라 트 리 의 모든 노드 를 방문 하고 모든 노드 는 한 번 만 방문 하 는 것 입 니 다.
    나무의 옮 겨 다 니 는 것 은 항상 세 가지 로 나 뉜 다.
  • 나무의 앞 순 서 는 (뿌리 정도) 옮 겨 다 닌 다. 뿌리 밑 에 뿌리 가 있다 면 아래 뿌리 를 계속 방문 하 라)
  • 나무의 뒷 순 서 는 (좌우 뿌리.)
  • 나무의 층 차 를 옮 겨 다 닌 다
  • 나무의 앞 순 서 를 옮 겨 다 니 는 것 과 뒤 순 서 를 옮 겨 다 니 는 정 의 는 재 귀 성 을 가지 기 때문에 재 귀 방식 으로 나무의 앞, 뒤 순 서 를 옮 겨 다 니 는 것 을 실현 합 니 다. 각자 규정된 순서에 따라 뿌리 노드 를 방문 할 때 뿌리 노드 의 값 을 출력 하고 서브 트 리 를 방문 할 때 재 귀 호출 을 하면 됩 니 다.
    1. 나무의 앞 순 서 를 옮 겨 다 닌 다.
    void preorder(tree p)
    {
         
        int i;
        if(p!=NULL)
        {
         
            printf("%c",p->data);
            for(i=0;i<m;i++)
                preorder(p->child[i]);
        }
    }
    

    2. 나무의 뒷 순 서 를 옮 겨 다 닌 다.
    void postorder(tree p)
    {
         
        int i;
        if(p!=NULL)
        {
         
            for(i=0;i<m;i++)    /*               */
                postorder(p->child[i]);
            printf("%c",p->data);   /*       */
        }
    }
    

    3. 나무의 앞 순 서 를 옮 겨 다 니 며 3 도 트 리 를 만 듭 니 다.
    루트 주소 되 돌리 기
    tree createtree()
    {
         
        int i;
        char ch;
        tree t;
        if((ch=getchar())=='#')
            t=NULL;
        else
        {
         
            t=(tree)malloc(sizeof(node));
            t->data=ch;
            for(i=0;i<m;++i)
                t->child[i]=createtree();
        }
        return t;
    }
    

    4. 나무의 층 차 를 옮 겨 다 닌 다.
    대열 (선진 선 출) 사상: 먼저 1 층 결점 을 방문 하고 자녀 가 있 으 면 자녀 를 대열 에 넣 고, 2 층 결점 을 방문 할 때 갓 가입 한 결점 을 대열 에 낸다. 그리고 2 층 결점 의 자녀 를 대열 에 묶는다... 상기 과정 을 반복 한다. (대열 의 모든 요 소 는 줄 을 서서 방문 을 기다 리 는 결점 이다)
    사상: 나무의 층 차 를 옮 겨 다 니 는 과정 에서 특정한 층 의 모든 노드 의 자녀 노드 에 대해 다음 층 의 모든 노드 를 구성 합 니 다. 그 다음 에 방문 해 야 할 것 은 바로 그들 입 니 다. 나무의 층 차 를 옮 겨 다 니 는 과정 에서 먼저 뿌리 노드 를 방문 하기 때문에 초기 대기 열 에는 뿌리 노드 만 포함 되 어 있 습 니 다. 대기 열 이 비어 있 지 않 으 면 노드 가 방문 되 지 않 았 다 는 것 을 의미 합 니 다.
    void levelorder(tree t)
    {
         
        tree queue[100];  /*           */
        int f,r,i;        /*f ,r     、    */
        tree p;
        f=0;r=1;queue[0]=t;
        while(f<t)     /*     */
        {
         
            p=queue[f];
            f++;
            printf("%c",p->data);
            for(i=0;i<m;++i)
                if(p->child[i])
                {
         
                    queue[r]=p->child[i];
                    ++r;
                }
        }
    }
    

    6.5 나무의 선형 표시
    6.5.1 나무의 괄호 표시
  • 나무 T 가 빈 나무 라면 괄호 가 비어 있다.
  • 나무 T 가 하나의 결점 만 포함 하면 괄호 는 이 결점 자 체 를 나타 낸다.
  • 상기 상황 이 아니라면 * * A (B, C (F, G, H), D, E (J, I) * * * 주의, 쉼표 가 있 음!!!
  • 6.5.2 나무의 층 호 표시
    j 를 트 리 의 결점 으로 설정 합 니 다. j 가 부여 한 정수 lev (j) 가 다음 과 같은 두 가지 조건 을 만족 시 키 면:
  • 결점 i 가 j 의 뒷부분 이 라면 lev (i) > lev (j)
  • 결점 i 와 j 가 같은 결점 의 뒷부분 이 라면 lev (i) = lev (j)
  • 상기 조건 을 만족 시 키 는 정수 치 lev (j) 를 결점 j 의 층 번호 라 고 한다.
    밤 한 개:
  • 10A , 20B , 20C , 30F , 30G , 30H , 20D , 20E , 40J , 40I
  • 1A , 2B , 2C , 5F , 5G , 5H , 2D , 2E , 3J , 3I
  • 좋은 웹페이지 즐겨찾기