taocp 2_3_1

53
이짂트리의 운행 아꿈사: http://cafe.naver.com/architect1 김태우: [email protected] http://en.wikipedia.org/wiki/Binary_tree

Upload: taewoo-kim

Post on 14-Jul-2015

606 views

Category:

Education


6 download

TRANSCRIPT

Page 1: Taocp  2_3_1

이짂트리의 운행

아꿈사: http://cafe.naver.com/architect1 김태우: [email protected]

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

Page 2: Taocp  2_3_1

이짂트리 빈 집합 또는 하나의 루트와 두 개의 이진트리들로 구성된 노드들의 유한 집합

A

C

D E F

G H

B

J (1)

Page 3: Taocp  2_3_1

- 각 노드마다 두 링크 LLINK와 RLINK를 둔다. - 그리고 트리 젂체에 대해 “트리를 가리키는 포인터”에

해당하는 링크 변수 T를 둔다. - 트리가 비어 있으면 T = ∧이고,

빈 트리가 아니면 T는 트리의 루트 노드의 주소이다. - LLINK(T)와 RLINK(T)는 각각 루트의 왼쪽, 오른쪽 하위

트리에 대한 포인터 들이다. - 이런 규칙들은 임의의 이진트리의 메모리 표현을

재귀적으로 정의한다.

이짂트리의 표현

Page 4: Taocp  2_3_1

이짂트리의 표현

A

C B

D E F

G H J

T

(2)

Page 5: Taocp  2_3_1

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

후위운행 (Postorder) Traverse( Root.Left ) Traverse( Root.Right ) Visit( Root )

중위운행 (Inorder) Traverse( Root.Left ) Visit( Root ) Traverse( Root.Right )

Page 6: Taocp  2_3_1

이짂트리의 운행

• 전위 운행

A B D C E G F H J

• 중위 운행

D B A E G C H F J

• 후위 운행

D B G E H J F C A

A

C

D E F

G H

B

J

(3)

(4)

(5)

Page 7: Taocp  2_3_1

알고리즘 T

• 이짂트리의 중위 운행

– T는 (2)와 같은 표현을 가짂 이짂트리를 가리키는 포인터

– 이 알고리즘은 그러한 이짂트리의 모든 노드들을 중위 순서로 방문

– 이를 위해 보조 스택 A를 사용

A

C B

D E F

G H J

T

(2)

Page 8: Taocp  2_3_1

T. 이짂트리의 중위 운행 – T1. [초기화]

• 스택 A를 비우고, 링크 변수 P를 T로 설정

– T2. [P = ∧ ?]

• 만일 P = ∧ 이면 단계 T4로 갂다

– T3. [스택 ⇐ P]

• 이제 P는 운행하고자 하는 비지 않은 이진트리를 가리킴

• A ⇐ P 로 설정

• P ← LLINK(P)로 설정하고 단계 T2로 갂다

– T4. [P ⇐ 스택]

• 만일 스택 A가 비었다면 종료.

• 그렇지 않으면 P ⇐ A로 설정

– T5. [P를 방문]

• NODE(P)를 방문

• P ← RLINK(P)로 설정하고 단계 T2로 돌아갂다

A

C B

D E F

G H J

T

(2)

Page 9: Taocp  2_3_1

(2)

A

C B

D E F

G H J

T

P

A

C B

D E F

G H J

T

A

P

A

C B

D E F

G H J

T B

A

P

A

C B

D E F

G H J

T

D

B

A

P

Page 10: Taocp  2_3_1

(2)

A

C B

D E F

G H J

T

D

B

A

P

D

A

C B

D E F

G H J

T B

A

P

D B

A

C B

D E F

G H J

T A

P

D B A

A

C B

D E F

G H J

T C

P

D B A

Page 11: Taocp  2_3_1

(2)

A

C B

D E F

G H J

T E

C

P

D B A

A

C B

D E F

G H J

T E

C

P

D B A E

A

C B

D E F

G H J

T G

C

P

D B A E

A

C B

D E F

G H J

T J

P

D B A E G C H F J

. . .

Page 12: Taocp  2_3_1

T. 증명

Page 13: Taocp  2_3_1

갂결한 표기

– P* = 전위 순서에서 NODE(P)의 후행자의 주소

– P$ = 중위 순서에서 NODE(P)의 후행자의 주소

– P# = 후위 순서에서 NODE(P)의 후행자의 주소

– *P = 전위 순서에서 NODE(P)의 선행자의 주소

– $P = 중위 순서에서 NODE(P)의 선행자의 주소

– #P = 후위 순서에서 NODE(P)의 선행자의 주소

(6)

Page 14: Taocp  2_3_1

갂결한 표기

• P가 루트를 가리킨다면

– INFO(P) =

– INFO(P*) =

– INFO(P$) =

– INFO($P) =

– INFO(#P) =

– P# = *P =

A

C B

D E F

G H J

T

* 전위 $ 중위 # 후위

A

B

E

B

C

LOC(T)

Page 15: Taocp  2_3_1

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

(7)

A

C

D E F

G H

B

J

Page 16: Taocp  2_3_1

(7)

- 점선은 스레드. 항상 트리의 더 높은 노드로 이어짐 - 모든 노드는 두 개의 링크를 소유

- C: 좌우 하위트리에 대한 보통의 링크 소유 - H: 말단노드. 두 개의 스레드 링크 소유 - D or J: 특별한 스레드 링크. 최좌 최우 노드의 특짓. 나중에...

A

C

D E F

G H

B

J

Page 17: Taocp  2_3_1

표현 비 스레드식 표현 스레드식 표현

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

(7)

A

C

D E F

G H

B

J

Page 18: Taocp  2_3_1

스레드식 이진트리의 왼쪽, 오른쪽 스레드 링크의 일반적인 방향들. 물결선들은 트리의 다른 부분으로의 링크 또는 스레드를 뜻함

Page 19: Taocp  2_3_1

알고리즘 S

• 스레드식 이짂트리의 중위순서 후행자

– P가 스레드식 이짂트리의 한 노드를 가리킨다고 할 때, 이 알고리즘은 Q ← P$로 설정한다

(7)

A

C

D E F

G H

B

J

Page 20: Taocp  2_3_1

S. 스레드식 이짂트리의 중위순서 후행자

– S1. [RLINK(P)가 스레드인가?]

• Q ← RLINK(P)로 설정

• 만일 RTAG(P) = 1이면 Terminate.

– S2. [왼쪽으로 검색]

• 만일 LTAG(Q) = 0이면 Q ← LLINK(Q)로 설정하고 이 단계를 반복. 그렇지 않으면 Terminate. A

C

D E F

G H

B

J

Page 21: Taocp  2_3_1

A

C

D E F

G H

B

J P A

Q

RTAG(P)

LTAG(Q)

0

A

C

D E F

G H

B

J P A

Q E

RTAG(P)

LTAG(Q)

0

1

A

C

D E F

G H

B

J P A

Q C

RTAG(P)

LTAG(Q)

0

0

INFO(P) = A 일때 INFO(P$) 인 E를 찾는다

Page 22: Taocp  2_3_1

A

C

D E F

G H

B

J P G

Q

RTAG(P)

LTAG(Q)

1

A

C

D E F

G H

B

J P G

Q C

RTAG(P)

LTAG(Q)

1

0

INFO(P) = G 일때 INFO(P$) 인 C를 찾는다

Page 23: Taocp  2_3_1

S가 효율적인가?

– S2가 여러 번 수행된다는 점 때문에 의심…

– P가 트리 안의 무작위 지점일 때의 단계 S2의 필수적 수행 횟수의 평균은?

• … 평균은 잘 모르겠지만…;;; 어쨌든…

• 앞의 CASE2일 때는 스택을 사용하는 방식보다는 효율적

• 이진트리 젂체를 운행할 필요없이 그냥 P에서 P$로 가는 용도로만 사용할 수도 있음

– S1. [RLINK(P)가 스레드인가?]

• Q ← RLINK(P)로 설정

• 만일 RTAG(P) = 1이면 Terminate.

– S2. [왼쪽으로 검색]

• 만일 LTAG(Q) = 0이면 Q LLINK(Q)로 설정하고 이 단계를 반복. 그렇지 않으면 Terminate.

알고리즘 S

Page 24: Taocp  2_3_1

MIX

Page 25: Taocp  2_3_1

알고리즘 I

• 스레드식 이짂트리에 노드 삽입

– NODE(P)의 오른쪽 하위트리가 비어 있으면 하나의 노드 NODE(Q)를 NODE(P)의 오른쪽 하위트리가 되도록 부착

– 비어 있지 않다면 NODE(Q)를 NODE(RLINK(P)) 사이에 삽입한다

• NODE(RLINK(P))는 NODE(Q)의 자식이 된다

A

C

D E F

G H

B

J

I

Page 26: Taocp  2_3_1

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

C

D E F

G H

B

J

I

Page 27: Taocp  2_3_1

A

C

D E F

G H

B

J

I 0

1 1

A

C

D E F

G H

B

J

I 0 0 1

Page 28: Taocp  2_3_1

A

C

D E F

G H

B

J

I 0 0 1

A

C

D E F

G H

B

J

I 0 0 1

Page 29: Taocp  2_3_1

A

C

D E F

G H

B

J

I

0

0 1

1 1

A

C

D E F

G H

B

J

I

0

0 1

1 1

D B A E G C H F I J

중위

Page 30: Taocp  2_3_1

오른쪽 스레드식 이짂트리

• 스레드식과 비스레드식 이짂트리 표현 방식 사이에 존재하는 중요한 중갂 형태

– 스레드식 RLINK들을 사용

– 빈 왼쪽 하위트리는 LLINK = ∧ 로 표현

– 두 접근 방식을 결합

• 이짂트리 구조의 응용중에 오른쪽으로만 운행하면 되는 것들이 대단히 많다

– LLINK들을 스레드로 연결할 필요가 없다

Page 31: Taocp  2_3_1

오른쪽 스레드식 이짂트리

– 이런 모습일 듯…

A

C

D E F

G H

B

J

스레드식 이짂트리

A

C

D E F

G H

B

J

오른쪽 스레드식 이짂트리

Page 32: Taocp  2_3_1

닮음, 동치 중요한 성질. 그리고 그 성질과 운행의 연관성을 살펴 보자. 두 이진 트리 T와 T`가 같은 구조를 가지고 있으면 그 둘을 닮았다(similar)고 말한다.

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

A

B

C D

A

B

C D

W

X

Y Z

A

B

C D

Page 33: Taocp  2_3_1

닮음

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

• 공식적 표현

– 둘 다 비어있거나,

– 둘 다 비어있지 않으며 둘의 왼쪽, 오른쪽 하위 트리들이 각각 서로 닮았음을 뜻함

Page 34: Taocp  2_3_1

닮음

• 비공식적 표현 1

– T의 도표와 T`의 도표가 같은 형태

• 비공식적 표현 2

– T의 노드들과 T`의 노드들 사이에 그 구조를 보존하는 일대일 대응 관계가 존재

– 즉, 만일 T의 노드 u1과 u2가 각각 T`의 노드 u1`과 u2`에 대응된다면 u1은 오직 u1`이 u2`의 왼쪽 하위트리일 때에만 u2의 왼쪽 하위트리이며, 이는 오른쪽 하위트리들에 대해서도 마찬가지

Page 35: Taocp  2_3_1

동치

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

• 공식적 표현 Info(u)가 노드 u에 담긴 정보를 의미한다고 할 때 두 트리는 오직…

– 둘 다 비었거나

– 둘 다 비어있지 않으며 info(root(T))=info(roo(T`))이고 그 왼쪽, 오른쪽 하위트리들이 각각 서로 동치일 때에만 서로 동치이다.

Page 36: Taocp  2_3_1

닮음, 동치 예제

트리 성질

1 2 안 닮음

2 3 4 닮음

2 4 동치

A

B

C D

A

B

C D

W

X

Y Z

A

B

C D

1 2 3 4

Page 37: Taocp  2_3_1

정리 A • 이짂 트리 T와 T`의 노드들이 각각 다음과 같다고 하자.

(전위 순서) 그리고 임의의 노드 u에 대해,

- 만일 u가 비지 않은 왼쪽 하위트리이면 l(u) = 1 그렇지 않으면 l(u) = 0

- 만일 u가 비지 않은 오른쪽 하위트리이면 r(u) = 1 그렇지 않으면 r(u) = 0

이라고 하자.

𝒖𝟏, 𝒖𝟐, … , 𝒖𝒏 과 𝒖𝟏` , 𝒖𝟐

` , … , 𝒖𝒏`

(11)

Page 38: Taocp  2_3_1

정리 A • 오직, n = n` 이고

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

• 위의 조건과 더불어, 오직 일 때에만 T와 T`는 동치이다.

(13)

(12)

1 ≤ 𝐽 ≤ 𝑛에 대해 𝑖𝑛𝑓𝑜 𝑢𝑗 = 𝑖𝑛𝑓𝑜(𝑢𝑗`)

1 ≤ 𝐽 ≤ 𝑛에 대해 𝑙 𝑢𝑗 = 𝑙 𝑢𝑗` , 𝑟 𝑢𝑗 = 𝑟(𝑢𝑗

`)

Page 39: Taocp  2_3_1

알고리즘 C

• 이짂트리의 복사 – HEAD는 이짂트리 T의 목록 머리의 주소

– 즉, T는 LLINK(HEAD)를 통해서 접근할 수 있는 HEAD의 왼쪽 하위트리

– NODE(U)는 빈 왼쪽 하위트리를 가짂 한 노드

– T의 복사본을 만들되 그 복사본이 NODE(U)의 왼쪽 하위 트리가 되게 함

– 특히, 만일 NODE(U)가 빈 이짂트리의 목록 머리라면, 그 빈 이짂트리를 T의 복사본으로 만듬

D

B

A

C

E F

G H

Page 40: Taocp  2_3_1

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)의 왼쪽에 붙인다

– C5. [전짂]

• P ← P*, Q ← Q* 로 설정

– C6. [완료 판정]

• 만일 P = HEAD이면 Terminate

• 그렇지 않으면 GOTO C2

D

B

A

C

E F

G H

Page 41: Taocp  2_3_1

D

B

A

C

E F

G H

T

P Q

C1

D

B

A

C

E F

G H

T

P Q

C4

D

B

A

C

E F

G H

T

P Q

C5 C2

D

B

A

C

E F

G H

T

P Q

Page 42: Taocp  2_3_1

C3

D

B

A

C

E F

G H

T

P Q

B

C4

D

B

A

C

E F

G H

T

P Q

B

C5

D

B

A

C

E F

G H

T

P Q

B

C2

D

B

A

C

E F

G H

T

P Q

B

Page 43: Taocp  2_3_1

C3

D

B

A

C

E F

G H

T

P Q

B

D

C5

D

B

A

C

E F

G H

T

P Q

B

D

C3

D

B

A

C

E F

G H

T

P Q

B

D

G

E

C6

D

B

A

C

E F

G H

T

P Q

B

D

G

. . .

Page 44: Taocp  2_3_1

연습문제

Page 45: Taocp  2_3_1

1. 이진트리 (2)에서 INFO(P)는 NODE(P)에 담긴 영문자를 뜻한다. 그렇다면 INFO( LLINK( RLINK ( RLINK(T) ) ) ) 은?

H

A

C B

D E F

G H J

T

(2)

Page 46: Taocp  2_3_1

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

젂위: 1245367 대칭: 4251637 후위: 4526731

Page 47: Taocp  2_3_1

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

참. 연습문제 2에서 4, 5, 6, 7이 항상 동일한 상대 위치를 가짐. 이진트리 크기에 대한 귀납법으로 즉시 증명됨.

Page 48: Taocp  2_3_1

4. 본문에서는 이진트리의 세 가지 기본적인 운행 순서들을 정의했다. 그 외에, 이런 순서도 있다. a) Visit( Root ) b) Traverse( Root Right ) c) Traverse( Root Left ) 이런 새로운 순서는 젂위, 중위, 후위 순서에 어떤 관계인가?

후위 순서의 역.

전위운행 (Preorder) Visit( Root ) Traverse( Root.Left ) Traverse( Root.Right )

후위운행 (Postorder) Traverse( Root.Left ) Traverse( Root.Right ) Visit( Root )

중위운행 (Inorder) Traverse( Root.Left ) Visit( Root ) Traverse( Root.Right )

Page 49: Taocp  2_3_1

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

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

A

C

D E F

G H

B

J

Page 50: Taocp  2_3_1

10. 이진트리에 노드가 n개 있다고 할 때, 알고리즘T 의 수행 도중 한 번에 스택에 넣을 수 있는 최대 노드 개수는 몇인가? (스택을 연속적으로 저장한다고 할 때 이 질문의 답은 저장소 할당에서 매우 중요하다)

모든 RLINK들이 공링크인 이진트리가 주어진다면, N개의 노드 주소들 모두가 스택에 들어가며 그 젂에는 그 어떤 노드 주소도 스택에서 제거되지 않는다.

Page 51: Taocp  2_3_1

13, 16, 17… 같이 풀어 봐요~ ㅠㅠ ㅈㅅ

Page 52: Taocp  2_3_1
Page 53: Taocp  2_3_1

Lisence