2010-02-02 5 views
5

inorder 및 preorder traversal을 사용하여 트리를 어떻게 구성 할 수 있습니까? 효율적인 알고리즘을 찾고 있습니다.트리 구성

+6

글쎄, 반복적으로. 네가 내 학생이 아니길 바래. –

+2

설명이 필요합니다. 입력 데이터의 형식은 무엇입니까? 나무가 균형을 이루고 있습니까? 효율적인 (Ordo (x) 또는 단지 "끔찍하게 미친 것은 아닙니다") 무엇을 의미합니까? 구축하려는 구조는 무엇입니까? 트리를 링크 된 객체로 사용하거나 트리를 배열로 사용합니다. – ron

+1

http://forums.devshed.com/software-design-43/finding-binary-tree-from-inorder-and-preorder-traversals-151147.html – Heinzi

답변

4

뻔뻔 스러움을 복사하고 Sun's (Oracle now, I guess...) forum에서 붙여 넣기 :

질문 :
아무도 중위에서 이진 트리 postorder 순회를 구성하는 방법에 대한 좀 도와 줄래, 내가 너무 알고리즘을 알고 싶어요 나는 그것을 적용 할 수있다.

답변 :
p_1, p_2...p_n가 postorder 통과하자 및 i_1, i_2...i_n이 중위 순회 할 수 있습니다. postorder traversal에서 트리의 루트가 p_n임을 알 수 있습니다. 중위 주사로이 요소를 찾아, i_2...i_k-1p_ni_k+1...i_ni_1을 말한다. inorder traversal에서 왼쪽 하위 트리의 모든 요소를 ​​찾습니다. 예를 들어 i_1, i_2...i_k-1 및 오른쪽 하위 트리가 각각 i_k+1...i_n입니다.

요소를 제거하십시오. p_n (및 요소 i_k==p_n). 가장 오른쪽 요소 p_1에서 p_j, p_ji_1, i_2 ... i_k-1의 요소입니다 p_2...p_j...p_n-1를 찾을 수 있습니다. 이것은 원래 트리의 왼쪽 하위 트리의 루트입니다. 분할 p_1, p_2...p_jp_j+1 ... p_n-1i_1i_2...i_k-1...i_ni_k+1. 이제 원래 트리의 두 하위 트리에 대한 순회 및 inorder 순회를 나타내는 두 개의 하위 시퀀스가 ​​있습니다.

저자 : JosAH.

나는 Jos의 지침에 따라 알고리즘을 구현했으며 완벽하게 작동했습니다.

+0

p_1 ~ p_n-1에서 오른쪽 끝에있는 요소 p_j를 찾는 데 너무 많은 시간이 걸리는 반면 i_1 ~ i_k-1에도 있습니다. 그것은 O (n^2) 시간이 걸립니다. 사실, p_n을 제거하고 i_1 ~ i_n에서 위치를 찾습니다. 우리는 이미 p_j의 위치를 ​​알고 있습니다. 이는 i_1 ~ i_n의 p_n 다음에 요소를 세 어서 얻을 수있는 왼쪽 및 오른쪽 하위 트리의 노드 수를 이미 알고 있기 때문입니다. 이것으로 p_1 ~ p_n-1을 나눌 곳을 쉽게 찾을 수있었습니다. – ibread

1

숙제이기 때문에 전적으로 대답하지는 않겠지 만, 잘하면 충분히 움직일 수있을 것입니다.

예를 들어, 선착순으로 말하면, this 트리라고 해봅시다.

탐색은 2-7-2-6-5-11-5 ... 등을 제공합니다. 5는 실제로 루트의 올바른 하위 항목입니다.

분명히 숫자 만 보는 것에서 알 수는 없으므로 트리의 구조에 대해 알려주거나 추가 데이터를 저장할 필요가 있습니다 (즉, 노드가 왼쪽인지 아동 또는 아동).

트리를 구문 분석하는 것은 선주문 탐색을 입력으로받는 재귀 함수입니다 (입력을 전달할 때 범위에 대해 생각해보십시오). 이전에 언급했듯이 선주문 통과에는 몇 가지 추가 데이터가 첨부되어 있어야합니다.


효율성 :

당신이이 나무를 구축뿐만 아니라, 입력을 읽는 작업을 고려할 때 각 노드가 방문 횟수를 고려한다. 나무를 만들 수있는 것보다 빠르게 입력을 재구성 할 수있는 방법이 있습니까? 데이터를 조작해야하는 경우 어떤 구조를 사용해야합니다.


주문 중 : 동일한 아이디어가 필요하므로이를 안내하지 않을 것입니다. 네가 절망적이라면 나는 다른 사람이 그렇게 할 것이라고 확신한다.

관련 문제