SlideShare uma empresa Scribd logo
1 de 53
Baixar para ler offline
이짂트리의 운행




                               http://en.wikipedia.org/wiki/Binary_tree

아꿈사: http://cafe.naver.com/architect1
김태우: codevania@gmail.com
이짂트리
빈 집합 또는
하나의 루트와 두 개의 이진트리들로 구성된 노드들의 유한 집합

                  A

              B           C

          D           E           F


                          G   H       J   (1)
이짂트리의 표현
- 각 노드마다 두 링크 LLINK와 RLINK를 둔다.
- 그리고 트리 젂체에 대해 “트리를 가리키는 포인터”에
  해당하는 링크 변수 T를 둔다.
- 트리가 비어 있으면 T = ∧이고,
  빈 트리가 아니면 T는 트리의 루트 노드의 주소이다.
- LLINK(T)와 RLINK(T)는 각각 루트의 왼쪽, 오른쪽 하위
  트리에 대한 포인터 들이다.
- 이런 규칙들은 임의의 이진트리의 메모리 표현을
  재귀적으로 정의한다.
이짂트리의 표현
                            T


                A

          B             C

      D         E                   F


                    G           H       J
(2)
이짂트리의 운행
  전위운행 (Preorder)                    중위운행 (Inorder)

Visit( Root )                     Traverse( Root.Left )
Traverse( Root.Left )             Visit( Root )
Traverse( Root.Right )            Traverse( Root.Right )


                   후위운행 (Postorder)

                Traverse( Root.Left )
                Traverse( Root.Right )
                Visit( Root )
이짂트리의 운행
• 전위 운행   (3)

 A B D C E G F H J
                             A
• 중위 운행   (4)            B           C
 D B A E G C H F J
                     D           E         F

• 후위 운행   (5)
                                     G H       J
 D B G E H J F C A
알고리즘 T
• 이짂트리의 중위 운행
 – T는 (2)와 같은 표현을 가짂 이짂트리를 가리키는
   포인터
 – 이 알고리즘은 그러한 이짂트리의 모든 노드들을
   중위 순서로 방문
 – 이를 위해 보조 스택 A를 사용       T


                          A


                      B           C


                 D        E               F


                              G       H       J
                (2)
T. 이짂트리의 중위 운행
– T1. [초기화]
   • 스택 A를 비우고, 링크 변수 P를 T로 설정
– T2. [P = ∧ ?]
   • 만일 P = ∧ 이면 단계 T4로 갂다
– T3. [스택 ⇐ P]
   • 이제 P는 운행하고자 하는 비지 않은 이진트리를 가리킴
   • A ⇐ P 로 설정
   • P ← LLINK(P)로 설정하고 단계 T2로 갂다                     T

– T4. [P ⇐ 스택]
                                          A
   • 만일 스택 A가 비었다면 종료.
   • 그렇지 않으면 P ⇐ A로 설정                B           C

– T5. [P를 방문]                  D          E                   F
   • NODE(P)를 방문
   • P ← RLINK(P)로 설정하고 단계 T2로 돌아갂다           G           H        J


                                                                  (2)
P                                                 P

                        T                                                 T
                                                  A

            A                                                 A


        B           C                                     B           C


D           E                   F             D               E                   F


                G           H       J                             G           H       J




    P                                                 P
                                                  D
B                       T                         B                       T
A                                                 A

            A                                                 A


        B           C                                     B           C


D           E                   F             D               E                   F


                G           H       J                             G           H       J
                                        (2)
P                                                 P
    D
    B                       T                         B                       T
    A                                                 A

                A                                                 A


            B           C                                     B           C


D               E                   F             D               E                   F


                    G           H       J                             G           H       J


        D                                                 DB
        P                                                 P

                            T                                                 T
A                                                     C

                A                                                 A


            B           C                                     B           C


D               E                   F             D               E                   F


                    G           H       J                             G           H       J
                                            (2)
        DBA                                               DBA
P                                                   P

    E                       T                           E                       T
    C                                                   C

                A                                                   A


            B           C                                       B           C


D               E                   F               D               E                   F


                    G           H       J                               G           H       J


        DBA                                                 DBAE
        P                                                   P

G                           T                                                   T
C                                                       J

                A                           ...                     A


            B           C                                       B           C


D               E                   F               D               E                   F


                    G           H       J                               G           H       J
                                              (2)
        DBAE                                                DBAEGCHFJ
T. 증명
갂결한 표기
– P* = 전위 순서에서 NODE(P)의 후행자의 주소
– P$ = 중위 순서에서 NODE(P)의 후행자의 주소
– P# = 후위 순서에서 NODE(P)의 후행자의 주소
– *P = 전위 순서에서 NODE(P)의 선행자의 주소
– $P = 중위 순서에서 NODE(P)의 선행자의 주소
– #P = 후위 순서에서 NODE(P)의 선행자의 주소   (6)
갂결한 표기

• P가 루트를 가리킨다면
 – INFO(P) = A                            T

 – INFO(P*) = B               A

 – INFO(P$) = E           B           C


 – INFO($P) = B       D       E                   F


 – INFO(#P) = C                   G           H       J

 – P# = *P = LOC(T)


              * 전위        $ 중위                    # 후위
Threaded Tree
NULL Link가 더 많다는 사실에 착안하여 고안
말단 링크들을 트리의 다른 부분에 대한 스레드로 대체

                  A


              B               C


          D           E               F



                          G       H       J   (7)
- 점선은 스레드. 항상 트리의 더 높은 노드로 이어짐
- 모든 노드는 두 개의 링크를 소유
  - C: 좌우 하위트리에 대한 보통의 링크 소유
  - H: 말단노드. 두 개의 스레드 링크 소유
  - D or J: 특별한 스레드 링크. 최좌 최우 노드의 특짓. 나중에...

                     A


                 B               C


             D           E               F



                             G       H       J   (7)
표현
비 스레드식 표현                   스레드식 표현
LLINK(P) = ∧                LTAG(P) = 1,       LLINK(P) = $P
LLINK(P) = Q ≠ ∧            LTAG(P) = 0,       LLINK(P) = Q
RLINK(P) = ∧                RTAG(P) = 1,       RLINK(P) = P$
RLINK(P) = Q ≠ ∧            RTAG(P) = 0,       RLINK(P) = Q

                           A


                       B               C


                   D           E               F



                                   G       H       J           (7)
스레드식 이진트리의 왼쪽, 오른쪽 스레드 링크의 일반적인 방향
들. 물결선들은 트리의 다른 부분으로의 링크 또는 스레드를 뜻함
알고리즘 S
• 스레드식 이짂트리의 중위순서 후행자
 – P가 스레드식 이짂트리의 한 노드를 가리킨다고 할
   때, 이 알고리즘은 Q ← P$로 설정한다
                A


            B               C



        D           E               F



                        G       H       J   (7)
S. 스레드식 이짂트리의 중위순서 후행자
– S1. [RLINK(P)가 스레드인가?]
  • Q ← RLINK(P)로 설정
  • 만일 RTAG(P) = 1이면
       Terminate.
– S2. [왼쪽으로 검색]
  • 만일 LTAG(Q) = 0이면
      Q ← LLINK(Q)로 설정하고 이 단계를 반복.
    그렇지 않으면
                             A
      Terminate.
                           B           C

                       D       E               F

                                   G       H       J
A                                                 A
             B                    C                            B                    C

         D                E               F                D                E               F

                              G       H       J                                 G       H       J
P   A   RTAG(P)   0                               P   A   RTAG(P)   0

Q       LTAG(Q)                                   Q   C   LTAG(Q)   0




                      A

             B                    C

         D                E               F       INFO(P) = A 일때
                                                  INFO(P$) 인 E를 찾는다
                              G       H       J
P   A   RTAG(P)   0

Q   E   LTAG(Q)   1
A                                                 A
             B                    C                            B                    C

         D                E               F                D                E               F

                              G       H       J                                 G       H       J
P   G   RTAG(P)   1                               P   G   RTAG(P)   1

Q       LTAG(Q)                                   Q   C   LTAG(Q)   0




                                                  INFO(P) = G 일때
                                                  INFO(P$) 인 C를 찾는다
S가 효율적인가?
                – S1. [RLINK(P)가 스레드인가?]
                   • Q ← RLINK(P)로 설정
                   • 만일 RTAG(P) = 1이면
                        Terminate.
                – S2. [왼쪽으로 검색]
                   • 만일 LTAG(Q) = 0이면
                       Q LLINK(Q)로 설정하고 이 단계를 반복.
          알고리즘 S     그렇지 않으면
                       Terminate.


– S2가 여러 번 수행된다는 점 때문에 의심…
– P가 트리 안의 무작위 지점일 때의
  단계 S2의 필수적 수행 횟수의 평균은?
 • … 평균은 잘 모르겠지만…;;; 어쨌든…
 • 앞의 CASE2일 때는 스택을 사용하는 방식보다는 효율적
 • 이진트리 젂체를 운행할 필요없이
   그냥 P에서 P$로 가는 용도로만 사용할 수도 있음
MIX
알고리즘 I
• 스레드식 이짂트리에 노드 삽입
 – NODE(P)의 오른쪽 하위트리가 비어 있으면
   하나의 노드 NODE(Q)를 NODE(P)의
   오른쪽 하위트리가 되도록 부착
 – 비어 있지 않다면 NODE(Q)를 NODE(RLINK(P))
   사이에 삽입한다
   • NODE(RLINK(P))는 NODE(Q)의 자식이 된다
                    A

                B               C
                                                I
            D           E               F

                            G       H       J
I. 스레드식 이짂트리에 노드 삽입
– I1. [꼬리표들과 링크들을 조정]
 • RLINK(Q) ← RLINK(P),                RTAG(Q) ← RTAG(P)
 • RLINK(P) ← Q,                       RTAG(P) ← 0
 • LLINK(Q) ← P,                       LTAG(Q) ← 1
– I2. [RLINK(P)가 스레드였는가?]
 • 만일 RTAG(Q)=0이면
    LLINK(Q$) ← Q로 설정

                   A

               B               C
                                                I
           D           E               F

                           G       H       J
A

    B               C

D           E               F           1   I   1
                                0




                G       H       J




        A

    B               C

D           E               F           1
                                            I   0
                                    0




                G       H       J
A

    B               C

D           E               F       1   I   0
                                0




                G       H       J




        A

    B               C

D           E               F       1
                                        I   0
                                0




                G       H       J
A

    B               C

D           E               F
                                0




                G       H       1
                                    I       0




        A                                   J
                                        1       1



    B               C

D           E               F
                                0




                G       H           I
                                1           0
                                                       중위

                                            J       D B A E G C H F I J
                                        1       1
오른쪽 스레드식 이짂트리
• 스레드식과 비스레드식 이짂트리 표현 방식
  사이에 존재하는 중요한 중갂 형태
 – 스레드식 RLINK들을 사용
 – 빈 왼쪽 하위트리는 LLINK = ∧ 로 표현
 – 두 접근 방식을 결합


• 이짂트리 구조의 응용중에 오른쪽으로만
  운행하면 되는 것들이 대단히 많다
 – LLINK들을 스레드로 연결할 필요가 없다
오른쪽 스레드식 이짂트리
– 이런 모습일 듯…

    스레드식 이짂트리                           오른쪽 스레드식 이짂트리

        A                                    A

    B               C                    B               C

D           E               F       D            E               F


                G       H       J                    G       H       J
닮음, 동치
중요한 성질. 그리고 그 성질과 운행의 연관성을 살펴 보자.

두 이진 트리 T와 T`가 같은 구조를 가지고 있으면
그 둘을 닮았다(similar)고 말한다.

두 이진 트리 T와 T`가 닮았고 대응되는 노드들이 같은 정보를
담고 있다면 그 둘을 동치(equivalent)라고 말한다

         A   A           W           A

     B           B           X           B

 C       D   C       D   Y       Z   C       D
닮음
• 두 이짂 트리 T와 T`가 같은 구조를 가지고 있
  으면 그 둘을 닮았다(similar)고 말한다.
• 공식적 표현
 – 둘 다 비어있거나,
 – 둘 다 비어있지 않으며 둘의 왼쪽, 오른쪽
   하위 트리들이 각각 서로 닮았음을 뜻함
닮음
• 비공식적 표현 1
 – T의 도표와 T`의 도표가 같은 형태
• 비공식적 표현 2
 – T의 노드들과 T`의 노드들 사이에
   그 구조를 보존하는 일대일 대응 관계가 존재
 – 즉, 만일 T의 노드 u1과 u2가
   각각 T`의 노드 u1`과 u2`에 대응된다면
   u1은 오직 u1`이 u2`의 왼쪽 하위트리일 때에만
   u2의 왼쪽 하위트리이며,
   이는 오른쪽 하위트리들에 대해서도 마찬가지
동치
• 두 이짂 트리 T와 T`가 닮았고
  대응되는 노드들이 같은 정보를 담고 있다면
  그 둘을 동치(equivalent)라고 말한다.
• 공식적 표현
 Info(u)가 노드 u에 담긴 정보를 의미한다고 할 때
 두 트리는 오직…
 – 둘 다 비었거나
 – 둘 다 비어있지 않으며 info(root(T))=info(roo(T`))이고
   그 왼쪽, 오른쪽 하위트리들이 각각 서로 동치일 때에만
   서로 동치이다.
닮음, 동치 예제
              트리               성질
        12                 안 닮음
        234                닮음
        24                 동치

1             2             3           4

        A     A            W            A

    B              B            X           B

C       D     C        D    Y       Z   C       D
정리 A
• 이짂 트리 T와 T`의 노드들이 각각 다음과 같다고 하자.
                    `  `      (전위 순서)
       ������������ , ������������ , … , ������������ 과 ������������ , ������������ , … , ������������
                          `

 그리고 임의의 노드 u에 대해,
 - 만일 u가 비지 않은
   왼쪽 하위트리이면                       l(u) = 1
   그렇지 않으면                         l(u) = 0
 - 만일 u가 비지 않은
   오른쪽 하위트리이면                      r(u) = 1
   그렇지 않으면                         r(u) = 0              (11)
 이라고 하자.
정리 A
• 오직, n = n` 이고
                                  `                   `
  1 ≤ ������ ≤ ������에 대해 ������ ������������ = ������ ������������ , ������ ������������ = ������(������������ )   (12)

 일 때에만 T와 T`는 닮음이다.

• 위의 조건과 더불어, 오직
                                              `
  1 ≤ ������ ≤ ������에 대해 ������������������������ ������������ = ������������������������(������������ )           (13)

 일 때에만 T와 T`는 동치이다.
알고리즘 C
• 이짂트리의 복사
 – HEAD는 이짂트리 T의 목록 머리의 주소
 – 즉, T는 LLINK(HEAD)를 통해서 접근할 수 있는
   HEAD의 왼쪽 하위트리
 – NODE(U)는 빈 왼쪽 하위트리를 가짂 한 노드
 – T의 복사본을 만들되 그 복사본이 NODE(U)의
   왼쪽 하위 트리가 되게 함
 – 특히, 만일 NODE(U)가 빈 이짂트리의 목록 머리라면,
   그 빈 이짂트리를 T의 복사본으로 만듬
                                 A
                         B           C

                     D       E               F

                         G               H
C. 이짂트리의 복사
– C1. [초기화]
  • P ← HEAD, Q ← U 로 설정. GOTO C4
– C2. [오른쪽에 뭔가 있는가?]
  • 만일 NODE(P)에 오른쪽 하위 트리가 있다면
    R⟸AVAIL 로 설정하고,
    NODE(R)을 NODE(Q)의 오른쪽에 붙인다
– C3. [INFO를 복사]
  • INFO(Q)←INFO(P)로 설정
– C4. [왼쪽에 뭔가 있는가?]
  • 만일 NODE(P)에 왼쪽 하위 트리가 있다면
    R ⟸ AVAIL 로 설정하고,
    NODE(R)을 NODE(Q)의 왼쪽에 붙인다
                                        A
– C5. [전짂]
  • P ← P*, Q ← Q* 로 설정
                                    B       C
– C6. [완료 판정]                D   E                  F
   • 만일 P = HEAD이면 Terminate
                               G                H
   • 그렇지 않으면 GOTO C2
C1                                      C4
P                                   Q   P                                   Q

                T   A                                   T   A
                        C                                       C
        B                                       B
                                F                                       F
    D       E                               D       E
                            H                                       H
        G                                       G


C5                                      C2
P                                   Q   P                                   Q

                T   A                                   T   A
                        C                                       C
        B                                       B
                                F                                       F
    D       E                               D       E
                            H                                       H
        G                                       G
C3                                          C4
P                                       Q   P                                       Q

                T       A                                   T       A
                    B       C                                   B       C
        B                                           B
                                    F                                           F
    D       E                                   D       E
                                H                                           H
        G                                           G


C5                                          C2
P                                       Q   P                                       Q

                T       A                                   T       A
                    B       C                                   B       C
        B                                           B
                                    F                                           F
    D       E                                   D       E
                                H                                           H
        G                                           G
C3                                                    C5
P                                           Q         P                                           Q

                T           A                                         T           A
                        B       C                                             B       C
        B                                                     B
                    D                   F                                 D                   F
    D       E                                             D       E
                                    H                                                     H
        G                                                     G


C3                                                    C6
P                                           Q         P                                           Q

                T           A                                         T           A
                                                ...
                        B       C                                             B       C
        B                                                     B
                    D                   F                                 D       E           F
    D       E                                             D       E
                        G           H                                         G           H
        G                                                     G
연습문제
1. 이진트리 (2)에서 INFO(P)는 NODE(P)에 담긴 영문자를 뜻한다.
그렇다면
     INFO( LLINK( RLINK ( RLINK(T) ) ) ) 은?

H




                                            T


                                A


                            B           C


                       D        E                   F


                                    G           H       J
                      (2)
2. 이진트리   의 노드들을 젂위, 대칭, 후위 순서로 나열 하라.

젂위: 1245367
대칭: 4251637
후위: 4526731
3. 다음 명제의 참, 거짒을 판별하라
  “이진트리의 말단 노드들은 젂위, 중위, 후위에서
   동일한 상대 위치들로 나타난다.”

참.
연습문제 2에서 4, 5, 6, 7이 항상 동일한 상대 위치를 가짐.
이진트리 크기에 대한 귀납법으로 즉시 증명됨.
4. 본문에서는 이진트리의 세 가지 기본적인 운행 순서들을 정의
했다. 그 외에, 이런 순서도 있다.
  a) Visit( Root )
  b) Traverse( Root Right )
  c) Traverse( Root Left )
이런 새로운 순서는 젂위, 중위, 후위 순서에 어떤 관계인가?

 후위 순서의 역.



                    전위운행 (Preorder)               중위운행 (Inorder)

                  Visit( Root )                 Traverse( Root.Left )
                  Traverse( Root.Left )         Visit( Root )
                  Traverse( Root.Right )        Traverse( Root.Right )

                                  후위운행 (Postorder)

                                Traverse( Root.Left )
                                Traverse( Root.Right )
                                Visit( Root )
5. „듀이 10진 표기법‟으로 젂위, 중위, 후위 순서를 갂편하게 서술
할 수 있음을 보여라.
 오른쪽 아래 트리에서 H = 1110 이다.

젂위 순서로의 나열: „빈칸‟ < 0 < 1
후위 순서로의 나열: 0 < 1 < „빈칸‟
중위 순서로의 나열: 0 < „빈칸‟ < 1




                                   A
                               B           C

                           D           E         F

                                           G H       J
10. 이진트리에 노드가 n개 있다고 할 때, 알고리즘T 의 수행 도중
한 번에 스택에 넣을 수 있는 최대 노드 개수는 몇인가?
(스택을 연속적으로 저장한다고 할 때 이 질문의 답은 저장소
할당에서 매우 중요하다)
모든 RLINK들이 공링크인 이진트리가 주어진다면,
N개의 노드 주소들 모두가 스택에 들어가며
그 젂에는 그 어떤 노드 주소도 스택에서 제거되지 않는다.
13, 16, 17… 같이 풀어 봐요~ ㅠㅠ ㅈㅅ
Lisence

Mais conteúdo relacionado

Mais de codevania

3장 자동적으로 움직이는 게임 에이전트 생성법
3장 자동적으로 움직이는 게임 에이전트 생성법3장 자동적으로 움직이는 게임 에이전트 생성법
3장 자동적으로 움직이는 게임 에이전트 생성법codevania
 
Spin locks 추가 자료
Spin locks 추가 자료Spin locks 추가 자료
Spin locks 추가 자료codevania
 
Texture bombing
Texture bombingTexture bombing
Texture bombingcodevania
 
Memory corruption stack
Memory corruption stackMemory corruption stack
Memory corruption stackcodevania
 
Mathematical Structures for CS [Chapter3]456
Mathematical Structures for CS [Chapter3]456Mathematical Structures for CS [Chapter3]456
Mathematical Structures for CS [Chapter3]456codevania
 
Optimizing The Content Pipeline
Optimizing The Content PipelineOptimizing The Content Pipeline
Optimizing The Content Pipelinecodevania
 
시간 있으면 설계나 합시다
시간 있으면 설계나 합시다시간 있으면 설계나 합시다
시간 있으면 설계나 합시다codevania
 
Memory Corruption Heap
Memory Corruption HeapMemory Corruption Heap
Memory Corruption Heapcodevania
 
Generic Refraction Simulation
Generic Refraction SimulationGeneric Refraction Simulation
Generic Refraction Simulationcodevania
 
Interactive Refractions And Caustics Using Image Space Techniques
Interactive Refractions And Caustics Using Image Space TechniquesInteractive Refractions And Caustics Using Image Space Techniques
Interactive Refractions And Caustics Using Image Space Techniquescodevania
 

Mais de codevania (10)

3장 자동적으로 움직이는 게임 에이전트 생성법
3장 자동적으로 움직이는 게임 에이전트 생성법3장 자동적으로 움직이는 게임 에이전트 생성법
3장 자동적으로 움직이는 게임 에이전트 생성법
 
Spin locks 추가 자료
Spin locks 추가 자료Spin locks 추가 자료
Spin locks 추가 자료
 
Texture bombing
Texture bombingTexture bombing
Texture bombing
 
Memory corruption stack
Memory corruption stackMemory corruption stack
Memory corruption stack
 
Mathematical Structures for CS [Chapter3]456
Mathematical Structures for CS [Chapter3]456Mathematical Structures for CS [Chapter3]456
Mathematical Structures for CS [Chapter3]456
 
Optimizing The Content Pipeline
Optimizing The Content PipelineOptimizing The Content Pipeline
Optimizing The Content Pipeline
 
시간 있으면 설계나 합시다
시간 있으면 설계나 합시다시간 있으면 설계나 합시다
시간 있으면 설계나 합시다
 
Memory Corruption Heap
Memory Corruption HeapMemory Corruption Heap
Memory Corruption Heap
 
Generic Refraction Simulation
Generic Refraction SimulationGeneric Refraction Simulation
Generic Refraction Simulation
 
Interactive Refractions And Caustics Using Image Space Techniques
Interactive Refractions And Caustics Using Image Space TechniquesInteractive Refractions And Caustics Using Image Space Techniques
Interactive Refractions And Caustics Using Image Space Techniques
 

Taocp 2_3_1

  • 1. 이짂트리의 운행 http://en.wikipedia.org/wiki/Binary_tree 아꿈사: http://cafe.naver.com/architect1 김태우: codevania@gmail.com
  • 2. 이짂트리 빈 집합 또는 하나의 루트와 두 개의 이진트리들로 구성된 노드들의 유한 집합 A B C D E F G H J (1)
  • 3. 이짂트리의 표현 - 각 노드마다 두 링크 LLINK와 RLINK를 둔다. - 그리고 트리 젂체에 대해 “트리를 가리키는 포인터”에 해당하는 링크 변수 T를 둔다. - 트리가 비어 있으면 T = ∧이고, 빈 트리가 아니면 T는 트리의 루트 노드의 주소이다. - LLINK(T)와 RLINK(T)는 각각 루트의 왼쪽, 오른쪽 하위 트리에 대한 포인터 들이다. - 이런 규칙들은 임의의 이진트리의 메모리 표현을 재귀적으로 정의한다.
  • 4. 이짂트리의 표현 T A B C D E F G H J (2)
  • 5. 이짂트리의 운행 전위운행 (Preorder) 중위운행 (Inorder) Visit( Root ) Traverse( Root.Left ) Traverse( Root.Left ) Visit( Root ) Traverse( Root.Right ) Traverse( Root.Right ) 후위운행 (Postorder) Traverse( Root.Left ) Traverse( Root.Right ) Visit( Root )
  • 6. 이짂트리의 운행 • 전위 운행 (3) A B D C E G F H J A • 중위 운행 (4) B C D B A E G C H F J D E F • 후위 운행 (5) G H J D B G E H J F C A
  • 7. 알고리즘 T • 이짂트리의 중위 운행 – T는 (2)와 같은 표현을 가짂 이짂트리를 가리키는 포인터 – 이 알고리즘은 그러한 이짂트리의 모든 노드들을 중위 순서로 방문 – 이를 위해 보조 스택 A를 사용 T A B C D E F G H J (2)
  • 8. T. 이짂트리의 중위 운행 – T1. [초기화] • 스택 A를 비우고, 링크 변수 P를 T로 설정 – T2. [P = ∧ ?] • 만일 P = ∧ 이면 단계 T4로 갂다 – T3. [스택 ⇐ P] • 이제 P는 운행하고자 하는 비지 않은 이진트리를 가리킴 • A ⇐ P 로 설정 • P ← LLINK(P)로 설정하고 단계 T2로 갂다 T – T4. [P ⇐ 스택] A • 만일 스택 A가 비었다면 종료. • 그렇지 않으면 P ⇐ A로 설정 B C – T5. [P를 방문] D E F • NODE(P)를 방문 • P ← RLINK(P)로 설정하고 단계 T2로 돌아갂다 G H J (2)
  • 9. P P T T A A A B C B C D E F D E F G H J G H J P P D B T B T A A A A B C B C D E F D E F G H J G H J (2)
  • 10. P P D B T B T A A A A B C B C D E F D E F G H J G H J D DB P P T T A C A A B C B C D E F D E F G H J G H J (2) DBA DBA
  • 11. P P E T E T C C A A B C B C D E F D E F G H J G H J DBA DBAE P P G T T C J A ... A B C B C D E F D E F G H J G H J (2) DBAE DBAEGCHFJ
  • 13. 갂결한 표기 – P* = 전위 순서에서 NODE(P)의 후행자의 주소 – P$ = 중위 순서에서 NODE(P)의 후행자의 주소 – P# = 후위 순서에서 NODE(P)의 후행자의 주소 – *P = 전위 순서에서 NODE(P)의 선행자의 주소 – $P = 중위 순서에서 NODE(P)의 선행자의 주소 – #P = 후위 순서에서 NODE(P)의 선행자의 주소 (6)
  • 14. 갂결한 표기 • P가 루트를 가리킨다면 – INFO(P) = A T – INFO(P*) = B A – INFO(P$) = E B C – INFO($P) = B D E F – INFO(#P) = C G H J – P# = *P = LOC(T) * 전위 $ 중위 # 후위
  • 15. Threaded Tree NULL Link가 더 많다는 사실에 착안하여 고안 말단 링크들을 트리의 다른 부분에 대한 스레드로 대체 A B C D E F G H J (7)
  • 16. - 점선은 스레드. 항상 트리의 더 높은 노드로 이어짐 - 모든 노드는 두 개의 링크를 소유 - C: 좌우 하위트리에 대한 보통의 링크 소유 - H: 말단노드. 두 개의 스레드 링크 소유 - D or J: 특별한 스레드 링크. 최좌 최우 노드의 특짓. 나중에... A B C D E F G H J (7)
  • 17. 표현 비 스레드식 표현 스레드식 표현 LLINK(P) = ∧ LTAG(P) = 1, LLINK(P) = $P LLINK(P) = Q ≠ ∧ LTAG(P) = 0, LLINK(P) = Q RLINK(P) = ∧ RTAG(P) = 1, RLINK(P) = P$ RLINK(P) = Q ≠ ∧ RTAG(P) = 0, RLINK(P) = Q A B C D E F G H J (7)
  • 18. 스레드식 이진트리의 왼쪽, 오른쪽 스레드 링크의 일반적인 방향 들. 물결선들은 트리의 다른 부분으로의 링크 또는 스레드를 뜻함
  • 19. 알고리즘 S • 스레드식 이짂트리의 중위순서 후행자 – P가 스레드식 이짂트리의 한 노드를 가리킨다고 할 때, 이 알고리즘은 Q ← P$로 설정한다 A B C D E F G H J (7)
  • 20. S. 스레드식 이짂트리의 중위순서 후행자 – S1. [RLINK(P)가 스레드인가?] • Q ← RLINK(P)로 설정 • 만일 RTAG(P) = 1이면 Terminate. – S2. [왼쪽으로 검색] • 만일 LTAG(Q) = 0이면 Q ← LLINK(Q)로 설정하고 이 단계를 반복. 그렇지 않으면 A Terminate. B C D E F G H J
  • 21. A A B C B C D E F D E F G H J G H J P A RTAG(P) 0 P A RTAG(P) 0 Q LTAG(Q) Q C LTAG(Q) 0 A B C D E F INFO(P) = A 일때 INFO(P$) 인 E를 찾는다 G H J P A RTAG(P) 0 Q E LTAG(Q) 1
  • 22. A A B C B C D E F D E F G H J G H J P G RTAG(P) 1 P G RTAG(P) 1 Q LTAG(Q) Q C LTAG(Q) 0 INFO(P) = G 일때 INFO(P$) 인 C를 찾는다
  • 23. S가 효율적인가? – S1. [RLINK(P)가 스레드인가?] • Q ← RLINK(P)로 설정 • 만일 RTAG(P) = 1이면 Terminate. – S2. [왼쪽으로 검색] • 만일 LTAG(Q) = 0이면 Q LLINK(Q)로 설정하고 이 단계를 반복. 알고리즘 S 그렇지 않으면 Terminate. – S2가 여러 번 수행된다는 점 때문에 의심… – P가 트리 안의 무작위 지점일 때의 단계 S2의 필수적 수행 횟수의 평균은? • … 평균은 잘 모르겠지만…;;; 어쨌든… • 앞의 CASE2일 때는 스택을 사용하는 방식보다는 효율적 • 이진트리 젂체를 운행할 필요없이 그냥 P에서 P$로 가는 용도로만 사용할 수도 있음
  • 24. MIX
  • 25. 알고리즘 I • 스레드식 이짂트리에 노드 삽입 – NODE(P)의 오른쪽 하위트리가 비어 있으면 하나의 노드 NODE(Q)를 NODE(P)의 오른쪽 하위트리가 되도록 부착 – 비어 있지 않다면 NODE(Q)를 NODE(RLINK(P)) 사이에 삽입한다 • NODE(RLINK(P))는 NODE(Q)의 자식이 된다 A B C I D E F G H J
  • 26. I. 스레드식 이짂트리에 노드 삽입 – I1. [꼬리표들과 링크들을 조정] • RLINK(Q) ← RLINK(P), RTAG(Q) ← RTAG(P) • RLINK(P) ← Q, RTAG(P) ← 0 • LLINK(Q) ← P, LTAG(Q) ← 1 – I2. [RLINK(P)가 스레드였는가?] • 만일 RTAG(Q)=0이면 LLINK(Q$) ← Q로 설정 A B C I D E F G H J
  • 27. A B C D E F 1 I 1 0 G H J A B C D E F 1 I 0 0 G H J
  • 28. A B C D E F 1 I 0 0 G H J A B C D E F 1 I 0 0 G H J
  • 29. A B C D E F 0 G H 1 I 0 A J 1 1 B C D E F 0 G H I 1 0 중위 J D B A E G C H F I J 1 1
  • 30. 오른쪽 스레드식 이짂트리 • 스레드식과 비스레드식 이짂트리 표현 방식 사이에 존재하는 중요한 중갂 형태 – 스레드식 RLINK들을 사용 – 빈 왼쪽 하위트리는 LLINK = ∧ 로 표현 – 두 접근 방식을 결합 • 이짂트리 구조의 응용중에 오른쪽으로만 운행하면 되는 것들이 대단히 많다 – LLINK들을 스레드로 연결할 필요가 없다
  • 31. 오른쪽 스레드식 이짂트리 – 이런 모습일 듯… 스레드식 이짂트리 오른쪽 스레드식 이짂트리 A A B C B C D E F D E F G H J G H J
  • 32. 닮음, 동치 중요한 성질. 그리고 그 성질과 운행의 연관성을 살펴 보자. 두 이진 트리 T와 T`가 같은 구조를 가지고 있으면 그 둘을 닮았다(similar)고 말한다. 두 이진 트리 T와 T`가 닮았고 대응되는 노드들이 같은 정보를 담고 있다면 그 둘을 동치(equivalent)라고 말한다 A A W A B B X B C D C D Y Z C D
  • 33. 닮음 • 두 이짂 트리 T와 T`가 같은 구조를 가지고 있 으면 그 둘을 닮았다(similar)고 말한다. • 공식적 표현 – 둘 다 비어있거나, – 둘 다 비어있지 않으며 둘의 왼쪽, 오른쪽 하위 트리들이 각각 서로 닮았음을 뜻함
  • 34. 닮음 • 비공식적 표현 1 – T의 도표와 T`의 도표가 같은 형태 • 비공식적 표현 2 – T의 노드들과 T`의 노드들 사이에 그 구조를 보존하는 일대일 대응 관계가 존재 – 즉, 만일 T의 노드 u1과 u2가 각각 T`의 노드 u1`과 u2`에 대응된다면 u1은 오직 u1`이 u2`의 왼쪽 하위트리일 때에만 u2의 왼쪽 하위트리이며, 이는 오른쪽 하위트리들에 대해서도 마찬가지
  • 35. 동치 • 두 이짂 트리 T와 T`가 닮았고 대응되는 노드들이 같은 정보를 담고 있다면 그 둘을 동치(equivalent)라고 말한다. • 공식적 표현 Info(u)가 노드 u에 담긴 정보를 의미한다고 할 때 두 트리는 오직… – 둘 다 비었거나 – 둘 다 비어있지 않으며 info(root(T))=info(roo(T`))이고 그 왼쪽, 오른쪽 하위트리들이 각각 서로 동치일 때에만 서로 동치이다.
  • 36. 닮음, 동치 예제 트리 성질 12 안 닮음 234 닮음 24 동치 1 2 3 4 A A W A B B X B C D C D Y Z C D
  • 37. 정리 A • 이짂 트리 T와 T`의 노드들이 각각 다음과 같다고 하자. ` ` (전위 순서) ������������ , ������������ , … , ������������ 과 ������������ , ������������ , … , ������������ ` 그리고 임의의 노드 u에 대해, - 만일 u가 비지 않은 왼쪽 하위트리이면 l(u) = 1 그렇지 않으면 l(u) = 0 - 만일 u가 비지 않은 오른쪽 하위트리이면 r(u) = 1 그렇지 않으면 r(u) = 0 (11) 이라고 하자.
  • 38. 정리 A • 오직, n = n` 이고 ` ` 1 ≤ ������ ≤ ������에 대해 ������ ������������ = ������ ������������ , ������ ������������ = ������(������������ ) (12) 일 때에만 T와 T`는 닮음이다. • 위의 조건과 더불어, 오직 ` 1 ≤ ������ ≤ ������에 대해 ������������������������ ������������ = ������������������������(������������ ) (13) 일 때에만 T와 T`는 동치이다.
  • 39. 알고리즘 C • 이짂트리의 복사 – HEAD는 이짂트리 T의 목록 머리의 주소 – 즉, T는 LLINK(HEAD)를 통해서 접근할 수 있는 HEAD의 왼쪽 하위트리 – NODE(U)는 빈 왼쪽 하위트리를 가짂 한 노드 – T의 복사본을 만들되 그 복사본이 NODE(U)의 왼쪽 하위 트리가 되게 함 – 특히, 만일 NODE(U)가 빈 이짂트리의 목록 머리라면, 그 빈 이짂트리를 T의 복사본으로 만듬 A B C D E F G H
  • 40. C. 이짂트리의 복사 – C1. [초기화] • P ← HEAD, Q ← U 로 설정. GOTO C4 – C2. [오른쪽에 뭔가 있는가?] • 만일 NODE(P)에 오른쪽 하위 트리가 있다면 R⟸AVAIL 로 설정하고, NODE(R)을 NODE(Q)의 오른쪽에 붙인다 – C3. [INFO를 복사] • INFO(Q)←INFO(P)로 설정 – C4. [왼쪽에 뭔가 있는가?] • 만일 NODE(P)에 왼쪽 하위 트리가 있다면 R ⟸ AVAIL 로 설정하고, NODE(R)을 NODE(Q)의 왼쪽에 붙인다 A – C5. [전짂] • P ← P*, Q ← Q* 로 설정 B C – C6. [완료 판정] D E F • 만일 P = HEAD이면 Terminate G H • 그렇지 않으면 GOTO C2
  • 41. C1 C4 P Q P Q T A T A C C B B F F D E D E H H G G C5 C2 P Q P Q T A T A C C B B F F D E D E H H G G
  • 42. C3 C4 P Q P Q T A T A B C B C B B F F D E D E H H G G C5 C2 P Q P Q T A T A B C B C B B F F D E D E H H G G
  • 43. C3 C5 P Q P Q T A T A B C B C B B D F D F D E D E H H G G C3 C6 P Q P Q T A T A ... B C B C B B D F D E F D E D E G H G H G G
  • 45. 1. 이진트리 (2)에서 INFO(P)는 NODE(P)에 담긴 영문자를 뜻한다. 그렇다면 INFO( LLINK( RLINK ( RLINK(T) ) ) ) 은? H T A B C D E F G H J (2)
  • 46. 2. 이진트리 의 노드들을 젂위, 대칭, 후위 순서로 나열 하라. 젂위: 1245367 대칭: 4251637 후위: 4526731
  • 47. 3. 다음 명제의 참, 거짒을 판별하라 “이진트리의 말단 노드들은 젂위, 중위, 후위에서 동일한 상대 위치들로 나타난다.” 참. 연습문제 2에서 4, 5, 6, 7이 항상 동일한 상대 위치를 가짐. 이진트리 크기에 대한 귀납법으로 즉시 증명됨.
  • 48. 4. 본문에서는 이진트리의 세 가지 기본적인 운행 순서들을 정의 했다. 그 외에, 이런 순서도 있다. a) Visit( Root ) b) Traverse( Root Right ) c) Traverse( Root Left ) 이런 새로운 순서는 젂위, 중위, 후위 순서에 어떤 관계인가? 후위 순서의 역. 전위운행 (Preorder) 중위운행 (Inorder) Visit( Root ) Traverse( Root.Left ) Traverse( Root.Left ) Visit( Root ) Traverse( Root.Right ) Traverse( Root.Right ) 후위운행 (Postorder) Traverse( Root.Left ) Traverse( Root.Right ) Visit( Root )
  • 49. 5. „듀이 10진 표기법‟으로 젂위, 중위, 후위 순서를 갂편하게 서술 할 수 있음을 보여라. 오른쪽 아래 트리에서 H = 1110 이다. 젂위 순서로의 나열: „빈칸‟ < 0 < 1 후위 순서로의 나열: 0 < 1 < „빈칸‟ 중위 순서로의 나열: 0 < „빈칸‟ < 1 A B C D E F G H J
  • 50. 10. 이진트리에 노드가 n개 있다고 할 때, 알고리즘T 의 수행 도중 한 번에 스택에 넣을 수 있는 최대 노드 개수는 몇인가? (스택을 연속적으로 저장한다고 할 때 이 질문의 답은 저장소 할당에서 매우 중요하다) 모든 RLINK들이 공링크인 이진트리가 주어진다면, N개의 노드 주소들 모두가 스택에 들어가며 그 젂에는 그 어떤 노드 주소도 스택에서 제거되지 않는다.
  • 51. 13, 16, 17… 같이 풀어 봐요~ ㅠㅠ ㅈㅅ
  • 52.