사전, 사후 및 순차적 순서 중 어떤 조합이 고유합니까?


28

우리는 주문 후,

post L(x)     => [x]
post N(x,l,r) => (post l) ++ (post r) ++ [x]

그리고 선주문

pre L(x)     => [x]
pre N(x,l,r) => [x] ++ (pre l) ++ (pre r)

그리고 순회 순회 기록. 순차적.

in L(x)     => [x]
in N(x,l,r) => (in l) ++ [x] ++ (in r)

우리는 짝을 이루는 별개의 키 / 레이블을 가정하더라도 주어진 트리를 고유하게 설명하지 않는다는 것을 쉽게 알 수 있습니다.

세 가지 중 어떤 조합을 사용하여 그 목적을 달성 할 수 있습니까?

긍정적 인 답변에는 트리를 재구성하는 (효율적인) 알고리즘과 그것이 올바른 이유에 대한 증거 (아이디어)가 포함되어야합니다. 부정적인 대답은 반대의 예, 즉 같은 표현을 가진 다른 나무를 제공해야합니다.

답변:


16

먼저 모든 요소가 고유하다고 가정하겠습니다. 요소가있는 나무의 모양을 알려주는 순차적 인 순서는 없습니다 [3,3,3,3,3]. 물론 일부 요소를 중복 요소로 재구성 할 수 있습니다. 충분한 조건이 존재하는지 모르겠습니다.

부정적인 결과를 계속하면 사전 주문 및 주문 후 순차만으로 바이너리 트리를 완전히 다시 작성할 수 없습니다. [1,2]선주문, [2,1]포스트 주문은 1루트 에 있어야 하지만 2왼쪽 자식이나 오른쪽 자식 일 수 있습니다. 이 모호성을 신경 쓰지 않으면 다음 알고리즘을 사용하여 트리를 재구성 할 수 있습니다.

  • 하자 사전 주문 탐색 및 수 후 주문 탐색합니다. 이어야 하며 이것이 트리의 루트입니다.[x1,,xn][yn,,y1]x1=y1
  • x2 는 루트의 가장 왼쪽 자식이고 는 가장 오른쪽 자식입니다. 경우 , 루트 노드는 단항이다; 이상 재귀 및 하나의 서브 트리를 구축 할 수 있습니다.y2x2=y2[x2,,xn][yn,,y2]
  • 그렇지 않으면 와 를 및 와 같은 색인으로 . 은 왼쪽 하위 트리의 사전 순서 순회이며, 오른쪽 하위 트리의 순서 순회이며, 포스트 순서 순회도 마찬가지입니다. 왼쪽 서브 트리에는 요소가 있고 오른쪽 서브 트리에는 요소가 있습니다. 각 서브 트리마다 한 번씩 반복하십시오. 그건 그렇고,이 방법은 임의의 분기를 가진 나무로 일반화됩니다. 임의의 분기를 사용하면 왼쪽 하위 트리의 범위를 찾아 두 목록에서 요소를 잘라낸 다음 왼쪽에서 두 번째 하위 트리를 잘라 내기 위해 반복합니다.ijx2=yiy2=xj[x2,,xj1][xj,,xn]j2=ni+1i2=nj+1
    j2

언급 한 바와 같이, 실행 시간은 이며 최악의 경우입니다 (두 자녀가있는 경우 각 목록을 선형 적으로 검색 함). 목록을 사전 처리하여 요소 값에서 입력 목록의 위치로 유한 맵 구조 를 빌드하는 경우 이를 할 수 있습니다. . 또한 배열 또는 유한 맵을 사용하여 인덱스에서 값으로 이동하십시오. 재귀 호출이 전체 맵을 수신하고 수행 대상을 알기 위해 범위를 인수로 사용하도록 전역 인덱스를 고수하십시오.O(n2)Θ(n2)O(nlg(n))nlg(n)

사전 순회 및 순차 순회 을 사용하면 다음과 같이 트리를 다시 작성할 수 있습니다.[x1,,xn][z1,,zn]

  • 루트는 선주문 순회 의 헤드입니다 .x1
  • 하자 되도록 인덱스 될 . 그런 다음 은 왼쪽 자식의 순서 순회이고 은 오른쪽 자식의 순서 순회입니다. 요소 수에 따라 는 왼쪽 자식의 사전 순회이며 오른쪽 자식의 입니다. 왼쪽 및 오른쪽 하위 트리를 작성하기 위해 반복합니다.z k = x 1 [ z 1 , , z k - 1 ] [ z k + 1 , , z n ] [ x 2 , , x k ] [ x k + 1 , , x n ]kzk=x1[z1,,zk1][zk+1,,zn][x2,,xk][xk+1,,xn]

다시 말하지만,이 알고리즘은 명시된 바와 같이 이며 , 목록이 값에서 위치로 유한 맵으로 사전 처리되는 경우 에서 수행 될 수 있습니다 .O ( NO(n2)O(nlg(n))

주문 후 플러스 주문은 물론 대칭입니다.


"[1,2] 선주문, [1,2] post-order는 루트에 1이 있어야하지만 2는 왼쪽 자식 또는 오른쪽 자식 일 수 있습니다." 2가 왼쪽 또는 오른쪽 자식인지에 관계없이 tree는 [1,2]가 아닌 [2,1]이됩니다. 또한, 당신은 프리오더와 포스트 오더가 모두 주어 졌다면, 우리는 트리를 재구성 할 수 없거나, 그들 중 하나만 주어지면 트리를 재구성 할 수 없다는 것을 의미합니까?
CEGRD

@CEGRD 실제로, 주문은 오타였습니다. 이 예에서는이 경우 트리를 완전히 재구성 할 수 없음을 보여줍니다 2. 왼쪽 자식인지 오른쪽 자식 인지 알 수 없습니다 . 이것은 재구성 알고리즘의 "단일 서브 트리"경우에 해당합니다.
Gilles 'SO- 악한 중지'

이진 검색 트리 인 경우 어떻게 변경합니까? 예제에서 간단한 경우 ([1,2] 선주문, [2,1] post-order) 루트가 1이고 2가 올바른 자식인지 (2가 1보다 큼) 결정할 수 있습니다. ... 권리?
fersarr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.