먼저 모든 요소가 고유하다고 가정하겠습니다. 요소가있는 나무의 모양을 알려주는 순차적 인 순서는 없습니다 [3,3,3,3,3]
. 물론 일부 요소를 중복 요소로 재구성 할 수 있습니다. 충분한 조건이 존재하는지 모르겠습니다.
부정적인 결과를 계속하면 사전 주문 및 주문 후 순차만으로 바이너리 트리를 완전히 다시 작성할 수 없습니다. [1,2]
선주문, [2,1]
포스트 주문은 1
루트 에 있어야 하지만 2
왼쪽 자식이나 오른쪽 자식 일 수 있습니다. 이 모호성을 신경 쓰지 않으면 다음 알고리즘을 사용하여 트리를 재구성 할 수 있습니다.
- 하자 사전 주문 탐색 및 수 후 주문 탐색합니다. 이어야 하며 이것이 트리의 루트입니다.[ x1, … , x엔][ y엔, … , y1]엑스1= y1
- 엑스2 는 루트의 가장 왼쪽 자식이고 는 가장 오른쪽 자식입니다. 경우 , 루트 노드는 단항이다; 이상 재귀 및 하나의 서브 트리를 구축 할 수 있습니다.와이2엑스2= y2[ x2, … , x엔][ y엔, … , y2]
- 그렇지 않으면 와 를 및 와 같은 색인으로 . 은 왼쪽 하위 트리의 사전 순서 순회이며, 오른쪽 하위 트리의 순서 순회이며, 포스트 순서 순회도 마찬가지입니다. 왼쪽 서브 트리에는 요소가 있고 오른쪽 서브 트리에는 요소가 있습니다. 각 서브 트리마다 한 번씩 반복하십시오.
그건 그렇고,이 방법은 임의의 분기를 가진 나무로 일반화됩니다. 임의의 분기를 사용하면 왼쪽 하위 트리의 범위를 찾아 두 목록에서 요소를 잘라낸 다음 왼쪽에서 두 번째 하위 트리를 잘라 내기 위해 반복합니다.나는jx2=yiy2=xj[x2,…,xj−1][xj,…,xn]j−2=n−i+1i−2=n−j+1
j−2
언급 한 바와 같이, 실행 시간은 이며 최악의 경우입니다 (두 자녀가있는 경우 각 목록을 선형 적으로 검색 함). 목록을 사전 처리하여 요소 값에서 입력 목록의 위치로 유한 맵 구조 를 빌드하는 경우 이를 할 수 있습니다. . 또한 배열 또는 유한 맵을 사용하여 인덱스에서 값으로 이동하십시오. 재귀 호출이 전체 맵을 수신하고 수행 대상을 알기 위해 범위를 인수로 사용하도록 전역 인덱스를 고수하십시오.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,…,zk−1][zk+1,…,zn][x2,…,xk][xk+1,…,xn]
다시 말하지만,이 알고리즘은 명시된 바와 같이 이며 , 목록이 값에서 위치로 유한 맵으로 사전 처리되는 경우 에서 수행 될 수 있습니다 .O ( NO(n2)O(nlg(n))
주문 후 플러스 주문은 물론 대칭입니다.