The Art of Computer Programming2.3.2 트리의 이진트리 표현아키텍트를 꿈꾸는 사람들cafe.naver.com/architect1현수명  soomong.net#soomong
트리의이진트리 표현	Forest 를이진트리로 변환운행비교대수공식의 조작	Algorithm D	MIXAL 구현
ForestADBCEGFKHJ임의의 일반 forest 를이진트리로 표현!
이걸 왜 하는것인가요??자네.일단 해보게나네!
임의의 일반 forest 를 이진트리로 표현하기Text방법각 가족의 자식들을 연결하고2.부모에서 첫째 자식으로의 링크를 제외한모든 수직 링크를 제거3. 시계방향으로 45 돌리기
Picture각 가족의 자식들을 연결하고BeforeADADBCEGFBCEGFKHJAfterAADADKHJBBCEGFBCEGFDCKHJKKHJEHF2. 부모에서 첫째 자식으로의 링크를 제외한모든 수직 링크를 제거JG3. 시계방향으로 45 돌리기
Definition자연대응Natural correspondence트리와 이진트리의 특별한 관계루트는 있지만 오른쪽 하위트리는 없는 이진트리어떤 트리들의 숲 :그에 대응하는 이진트리 :이면     의 루트 :이면     : 빈 이진트리     의 왼쪽 하위트리 :     의 오른쪽 하위트리 :
Example자연대응Natural correspondence그에 대응하는 이진트리ADBCEGF트리들의 숲AKHJBDCKEHFJG
45도 회전하지 않는게 편한 경우도 있음오른쪽 스레드 링크들이 한가족의 제일 오른쪽 자식에서 부모로 간다!
이걸 도대체 왜 하는것인가요? ㅜㅜ어허…트리가 나왔는데 운행이라도 해봐야 하지 않겠나네!
운행Traversing ForestTree 를 운행하는 것Forest 를 운행하는 것
Text운행Traversing 비교
Picture운행Traversing 비교?
ExampleForest전위운행ADADADADADADBCEGFBCEGFBCEGFBCEGFBCEGFBCEGFKHJKHJKHJKHJKHJKHJ(A(B,C(K)),D(E(H),F(J),G))
ExampleForest전위운행ADADADADADBCEGFBCEGFBCEGFBCEGFBCEGFKHJKHJKHJKHJKHJ(A(B,C(K)),D(E(H),F(J),G))
ExampleTree전위운행AAAAAABBBBBBDCDDDDDCCCCCKEKKKKKEEEEEHFHHHHHFFFFFJGJGJGJGJGJG(A(B,C(K)),D(E(H),F(J),G))
ExampleTree전위운행AAAAABBBBBDDDDDCCCCCKKKKKEEEEEHHHHHFFFFFJGJGJGJGJG(A(B,C(K)),D(E(H),F(J),G))
ExampleForest후위운행ADADADADADADBCEGFBCEGFBCEGFBCEGFBCEGFBCEGFKHJKHJKHJKHJKHJKHJ((B,(K)C)A,((H)E,(J)F,G)D)
ExampleForest후위운행ADADADADADBCEGFBCEGFBCEGFBCEGFBCEGFKHJKHJKHJKHJKHJ((B,(K)C)A,((H)E,(J)F,G)D)
ExampleTree중위운행AAAAAABBBBBBDCDCDDDDCCCCKEKEKKKKEEEEHFHFHHHHFFFFJGJGJGJGJGJG((B,(K)C)A,((H)E,(J)F,G)D)
ExampleTree중위운행AAAAABBBBBDDDDDCCCCCKKKKKEEEEEHHHHHFFFFFJGJGJGJGJG((B,(K)C)A,((H)E,(J)F,G)D)
운행결과Forest    의 전위 운행결과(A(B,C(K)),D(E(H),F(J),G)) =이진트리 의 전위 운행결과(A(B,C(K)),D(E(H),F(J),G))Forest    의 후위 운행결과((B,(K)C)A,((H)E,(J)F,G)D)=이진트리 의 중위 운행결과((B,(K)C)A,((H)E,(J)F,G)D)
운행결과P$일반 Tree,Forest에서는후위를 의미이진트리 에서는중위를 의미
운행을 마쳤습니다.자 그럼 이제 실질적인 문제에 적용해보지.대수 공식의 조작에서 tree 를 써보게나.오 실질적인 예제! +_+네!
실질적인 예대수공식을 tree 로 표현해보자-X/=↑a3+21왼쪽을 일반적인 트리라고 치고오른쪽 스레드식이진트리로 변환
Polish notation폴란드식 표기법전위운행 Prefix notation후위운행 postfix notation
Tree참고) 이산수학트리의 용어
트리의 응용
이진트리의 표현
트리 순회 알고리즘
트리에 대한 결과부분트리들을recursive 하게 순회하는 알고리즘rr1…rtr2T1TtT2전위preorder후위postorder중위inorder
Example 5.24,25a전위preorder  루트 – 왼쪽 - 오른쪽         a b d e c f h i gcb중위inorder    왼쪽 - 루트 - 오른쪽d b e a h f I c gdgfe후위postorder    왼쪽 – 오른쪽 - 루트        d e b h I f g c aih
Example 5.27*전위prefix notation  * + 2 x 4 -> *(2+x)4 -> (2+x)*44+중위infix notation(2+x)*42x후위postfix notation 2x+4* -> (2+x)4* -> (2+x)*4
미분이지!주어진 공식의 변수 x 에 대한 도함수를 구하게나이제 주어진 공식을 어떻게 조작할까요?헉 미분네…
도함수?미분?함수를 미분한다= 함수의 변화율을 구한다= 함수의 기울기를 구한다= 기울기 측정을 위한 도함수를 구한다
미분 규칙규칙들에 나열된 연산자들로 구성된임의의 공식 에 대한도함수를 구할 수 있다(11)(12)미분이 낯설다면이런 규칙들로 정의되는 하나의 추상적인 연습으로받아들이자(13)(14)(15)(16)(17)(18)(19)
Example
트리를 후위 순서로 운행하면서각 노드의도함수를 형상하는 작업을전체 도함수가 나올 때까지 계속후위 운행을 사용한다는 것은알고리즘이 연산자 노드를그 피연산자들을 미분한 이후에 처리한다는 뜻후위운행 postfix notation
서…설마…자 그럼 이 과정을MIX 로 해보게나아악 ㅜ_ㅜ
MIXAL대수 공식에 대한 오른쪽 스레드 이진 트리의노드 구조RLINK : 오른쪽 하위 노드RATG: 스레드인경우1LLINK : 왼쪽 하위 노드TYPE : 노드의 종류TYPE 0 : 하나의 상수TYPE 1 : 하나의 변수TYPE 2 : +TYPE 3 : -TYPE 4 : XTYPE 5 : /INFO : 상수일경우 그 값
Algorithm D (미분)Text변수 X에 대한 공식 Y의 해석적미분을 뜻하는 트리를 만들고 NODE(DY) 가 그것을 가리키게 만든다.D1. [초기화] 	P ← Y$ (트리의 후위순서로 첫째노드)D2. [미분] 	P1 ← LLINK(P)	if( P1 ≠ null ) then Q1 ← RLINK(P1)	DIFF[TYPE(P)] 수행D3. [링크 복원] 	if(TYPE(P) 가 이항연산자) then RLINK(P1) ← P2D4. [P$로 나아간다] 	P2 ← P, P ← P$	if(RTAG(P2) == 0 ) then RLINK(P2) ← QD5. [끝인가?] 	if(P ≠ Y) then GOTO D2.	else LLINK(DY) ← Q, RLINK(Q) ← DY, RTAG(Q) ← 1
Algorithm D (미분)Picture노드로 표현된 트리가 주어지면 y 부터 후위운행 하면서각 노드의TYPE 기준으로 미분규칙을 수행하고결과를 tree 로 재구성
Algorithm D (미분)NODE(P) : 오른쪽 스레드식이진트리의루트트리 구축 함수TREE(x,U,V) x 를 루트노트, U 와 V 를 하위트리로 하는 새 트리를 만든다TREE(x,U) 하위트리가하나인 새 트리를 만든다TREE(x)x 를 말단 루트 노드로 하는 새 트리를 만든다미분함수DIFF(0), DIFF(1) ~ DIFF(8)
트리 구축 함수PictureTREE(x,U,V) x 를 루트노트, U와V를 하위트리로 하는 새 트리를 만든다W ← AVAIL , INFO(W) ← x, LLINK(W) ← URLINK(U) ← W, RTAG(U) ← 0, RLINK(V) ← W, RTAG(V) ← 1WUV
트리 구축 함수PictureTREE(x,U) 하위트리가하나인 새 트리를 만든다 W ← AVAIL , INFO(W) ← x, LLINK(W) ← URLINK(U) ← W, RTAG(U) ← 1 WU
트리 구축 함수PictureTREE(x) 	x 를 말단 루트 노드로 하는 새 트리를 만든다W ← AVAIL , INFO(W) ← x, LLINK(W) ← nullW
미분 함수무항연산자DIFF(0) 상수	Q ← TREE(0)(11)DIFF(1) 변수if(INFO(P) = ‘X’) then Q ← TREE(1) 	else	 Q ← TREE(0) (12)
미분 함수단항연산자(13)DIFF(2) 로그if(INFO(Q)≠ 0) then Q ← TREE(“/”,Q,COPY(P1))  (14)DIFF(3) 부정if(INFO(Q) ≠ 0) then Q ← TREE(“neg”,Q)
미분 함수이항연산자P1 은 U , P2 는 VQ1 은 D(U), Q 는 D(V)(15)DIFF(4) + 연산if(INFO(Q1)==0) then AVAIL ← Q1else if(INFO(Q)==0) AVAIL ← Q, Q ← Q1else Q ← TREE(“+”,Q1,Q)  …나머지 부분과 MIX 코드는 생략
Algorithm D (미분)Picture노드로 표현된 트리가 주어지면 y 부터 후위운행 하면서각 노드의TYPE 기준으로 미분규칙을 수행하고결과를 tree 로 재구성

The Art of Computer Programming 2.3.2 Tree