선주문 + 주문 후 주문


11

직무

전체 이진 트리의 사전 주문 및 주문 이후 순회가 주어지면 순차 순회를 리턴하십시오.

순회는 각각 고유하게 노드를 식별 하는 n 개의 양의 정수를 포함하는 두 개의 목록으로 표시됩니다 . 프로그램은 이러한 목록을 가져와 합리적인 I / O 형식을 사용하여 순차 순회 결과를 출력 할 수 있습니다.

입력이 유효하다고 가정 할 수 있습니다 (즉, 목록은 실제로 일부 트리의 순회를 나타냄).

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다.

정의

완전 이진 트리 의 유한 구조 노드 고유 한 양의 정수가 여기에 표현.

전체 이진 트리는 단일 노드 로 구성된 리프입니다 .

                                      1

또는 두 개의 하위 트리 ( 왼쪽오른쪽 하위 트리 라고 함)가있는 하나의 노드 로 구성 되는 브랜치 는 각각 전체 이진 트리입니다.

                                      1
                                    /   \
                                  …       …

전체 이진 트리의 전체 예는 다음과 같습니다.

                                        6
                                      /   \
                                    3       4
                                   / \     / \
                                  1   8   5   7
                                     / \
                                    2   9

전체 이진 트리 의 사전 순서 순회 는 다음과 같이 재귀 적으로 정의됩니다.

  • 노드 n을 포함하는 리프 의 선주문 순서 는 목록 [ n ]입니다.
  • 노드 n 과 하위 트리 (L, R)를 포함 하는 분기 의 사전 주문 순회 는 목록 [ n ] +  사전 주문 ( L ) +  사전 주문 ( R )이며, 여기서 +는 목록 연결 연산자입니다.

위의 트리에서는 [6, 3, 1, 8, 2, 9, 4, 5, 7] 입니다.


후 주문 탐색 다음과 같이 전체 이진 트리의 재귀 적으로 정의된다 :

  • 노드 n을 포함하는 리프 의 주문 후 순회 는 목록 [ n ]입니다.
  • 노드 n 과 하위 트리 (L, R)를 포함 하는 분기의 후순 순회 는 목록 후순 ( L ) +  후순 ( R ) + [ n ]입니다.

위의 트리에서는 [1, 2, 9, 8, 3, 5, 7, 4, 6] 입니다.


에서 주문 탐색 다음과 같이 전체 이진 트리의 재귀 적으로 정의된다 :

  • 노드 n을 포함하는 리프 의 순서대로 순회 는 목록 [ n ]입니다.
  • (A)의 중위 순회 분기 노드 함유 N 및 서브 트리 (L, R)의 리스트이다 중위 ( L ) + [ N ] +  중위 ( R ).

위의 트리에서는 [1, 3, 2, 8, 9, 6, 5, 4, 7] 입니다.


결론 : 목록 [6, 3, 1, 8, 2, 9, 4, 5, 7] (pre) 및 [1, 2, 9, 8, 3, 5, 7, 4, 6] (post)를 입력으로 프로그램에서 [1, 3, 2, 8, 9, 6, 5, 4, 7]을 출력해야 합니다.

테스트 사례

각 테스트 사례는 형식 preorder, postorder → expected output입니다.

[8], [8] → [8]
[3,4,5], [4,5,3] → [4,3,5]
[1,2,9,8,3], [9,8,2,3,1] → [9,2,8,1,3]
[7,8,10,11,12,2,3,4,5], [11,12,10,2,8,4,5,3,7] → [11,10,12,8,2,7,4,3,5]
[1,2,3,4,5,6,7,8,9], [5,6,4,7,3,8,2,9,1] → [5,4,6,3,7,2,8,1,9]

입력이 특정 형태 (완전한 이진 트리)를 갖도록 보장되므로 실제로 두 입력이 모두 필요하지 않습니까?
feersum

이진 나무는 전체 가 아닌 전체 SO를, n은 일반적으로, 당신은 둘 다 필요합니까, - 요소 나무가 많은 모양을 가질 수 있고.
Lynn

주문에 문자열을 제공하는 단일 문자로 노드를 나타낼 수 있습니다. 예를 들어 두 번째 예는 다음과 같습니다 "CDE" and "DEC" give "DCE". (I 노드를 많이 필요로하는 경우도 유니 코드 문자를 사용하여)
톤 Hospel

@TonHospel 이것으로 괜찮을 것입니다. 논란의 여지가 있지만, 정수 목록의 정의를 약간 늘리는 것 "CDE"입니다. [67, 68, 69]:)
Lynn

답변:


2

펄, 69 66 62 56 53 바이트

에 +1 포함 -p

STDIN에서 공백으로 구분 된 한 줄로 포스트 오더 다음에 프리오더를받습니다 (사전 및 포스트의 순서를 알립니다). 노드는 고유 문자로 표시됩니다 (공백이 아니거나 줄 바꿈이없는 문자는 정상 임).

inpost.pl <<< "98231 12983"

inpost.pl:

#!/usr/bin/perl -p
s%(.)(.)+\K(.)(.+)\3(\1.*)\2%$4$5$3$2%&&redo;s;.+ ;;

원래 순수한 숫자 형식을 사용하려면 단일 숫자를 정확하게 식별하고 73 바이트로 제공되는 데 훨씬 더 많은주의가 필요합니다.

#!/usr/bin/perl -p
s%\b(\d+)(,\d+)+\K,(\d+\b)(.+)\b\3,(\1\b.*)\2\b%$4$5,$3$2%&&redo;s;.+ ;;

로 사용

inpostnum.pl <<< "11,12,10,2,8,4,5,3,7 7,8,10,11,12,2,3,4,5"

-p;끝에 a 를 추가 하므로 last가 필요하지 않습니다 ;. s;.* ;;->s;.* ;
Riley

@Riley 알고 있습니다. 그래서 나는 ;끝에 있습니다. 그러나 -p는 실제로 프로그램 \n;의 끝에 추가 합니다 -e. 파일 ;에서 파일이 끝나지 않는 경우에만 추가 됩니다 \n. -p+3이 아닌 +1 으로 주장하고 싶기 때문에 프로그램은 명령 줄에서 작동해야합니다 -e. 그리고 나는 그 결과로 얻을 수있는 가짜 줄 바꿈을 원하지 않습니다
Ton Hospel

커맨드 라인에서 실행하면 '주위 가 필요하지 않습니까? 파일을 원하는 방식으로 실행하면 (로 파일 호출 <<<) 마지막을 그대로 둘 수 있습니다 ;.
라일리

@Riley perl의 채점 방법 해석에 따라 다릅니다. 나는 그것이 덜 임시적이라고 생각하기 때문에 일반적으로 코드를 파일로 제출합니다. 그러나 내 제출물을 보면 코드 파일에 있어야 하는 경우 (예 : 코드가 '있거나 사용하는 do$0등) 항상 -p+3 (공백, 마이너스, p)으로 점수가 매겨 지지만 코드가 작동하면 당신이 얻을 명령 줄에 -e와를 '같이 무료로 나는 그것을 점수 +1그것이 함께 번들로 제공 할 수 있기 때문에e
톤 Hospel

좋아, 명령 줄 제출이 어떻게 점수를 매기는지 정확히 알지 못했습니다. 난 당신이 '무료로 얻을 몰랐어요 . 정리해 주셔서 감사합니다.
라일리

3

하스켈, 84 83 바이트

(a:b:c)#z|i<-1+length(fst$span(/=b)z),h<- \f->f i(b:c)#f i z=h take++a:h drop
a#_=a

2

자바 스크립트 (ES6), 100 바이트

f=(s,t,l=t.search(s[1]))=>s[1]?f(s.slice(1,++l+1),t.slice(0,l))+s[0]+f(s.slice(l+1),t.slice(l)):s[0]

I / O는 "안전한"문자열 (예 : 문자 또는 숫자)로되어 있습니다. 대체 접근법, 또한 100 바이트 :

f=(s,t,a=0,b=0,c=s.length-1,l=t.search(s[a+1])-b)=>c?f(s,t,a+1,b,l)+s[a]+f(s,t,l+2+a,l+1,c-l-2):s[a]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.