2013-05-27 2 views
2

배열을 이진 트리에 놓고 그 위에 BFT를 수행하면 첫 번째 순회가 수행하는 순서대로 정렬 된 배열을 반복하고 싶습니다. 내가 어떻게 이것을 현재 달성하는지). 분명히이 작업은 바이너리 트리에 어레이를 다시 빌드하고 저장해야하기 때문에 추가 메모리 오버 헤드가 필요합니다. 이 바이너리 검색과 유사해야하지만 나는 명령을 제대로받을 수 없다는 것을 알고있다.자바 : 배열 우선 순회 검색

다음
BTree bst = sortedArrayToBST(array); 
Queue<BTree> queue = new LinkedList<BTree>(); 
queue.add(bst); 
while(!queue.isEmpty()) { 
    BTree node = queue.remove(); 
    System.out.println(node.data); 
    if(node.left != null) queue.add(node.left); 
    if(node.right != null) queue.add(node.right); 
} 

내가 현재 가지고 무엇을 (그러나 이것은 분명히 잘못된 순서를 제공) : 여기

내가 현재이 달성 방법

public void bstIterate(int[] array, int start, int end) { 
    if(array.length == 0) return; 
    int med = array.length /2; 
    System.out.println(array[med]); 
    bstIterate(array,start,mid); 
    bstIterate(array,mid+1,array.length); 
} 

이 추가 메모리 오버 헤드없이 할 수있는, 또는 스택, 벡터 또는 대기열에 항목을 저장해야합니까? 그렇다면 어떻게하면 2 진 트리보다 메모리가 적게 듭니까?

+0

BFS를 수행하기 위해 이진 트리를 만들지 않아도되지만 큐가 필요합니다. – DarthVader

+1

당신은 그들이 어떻게 이진 트리에 놓이게 될지 말하지 않았습니다. 힙 이냐, 어떤 순서이든간에?(이 경우에는 원하는 순서로 값을 반환하십시오.) 이진 검색 트리입니까? 균형이 잡혔습니까? – Alpedar

+0

죄송합니다. 그렇습니다. 'sortedArraytoBST'에 의해 생성 된 BST는 균형 잡힌 이진 트리를 생성합니다. –

답변

2

나는이 특히 효과적이다 모르겠지만, 하나 개의 가능한 솔루션은 bstIterate 방법에 깊이 매개 변수를 전달하고 반복적으로 호출하는 것입니다 : O(n) 복잡성 작업 (쉽게 자바로 변환 할 수 있기를 바랍니다) 더 이상 결과를 반환하지 않을 때까지 깊이가 증가합니다. 이 같은

뭔가 :

public static boolean bstIterate(int array[], int start, int end, int depth) { 
    if (end <= start) 
    return false; 
    else { 
    int mid = start + (end-start)/2; 
    if (depth == 0) { 
     System.out.println(array[mid]); 
     return true; 
    } 
    else { 
     boolean res1 = bstIterate(array, start, mid, depth-1); 
     boolean res2 = bstIterate(array, mid+1, end, depth-1); 
     return res1 || res2; 
    } 
    } 
} 

이 같이 부를 것이다 :

int depth = 0; 
while (bstIterate(array, 0, array.length, depth)) 
    depth++; 

이 배열을 감안할 때 :

   13 
     4     25 
    3  9   23 30 
1  7   18 
:이 나무를 생산

int array[] = {1, 3, 4, 7, 9, 13, 18, 23, 25, 30}; 

17,451,515,

이 출력 :

13 
4 
25 
3 
9 
23 
30 
1 
7 
18 

당신이 생각했던 무엇인가요?

+0

이것은 [ID가있는 DFS]와 유사합니다 (http://en.wikipedia.org/wiki/Depth-first_search_with_iterative_deepening). 그러나 나는 그것이 옵션이라고 생각한다. – Dukeling

+0

거기에는 이름이 있습니다. 그러나이 점을 주목하십시오. "IDDFS는 너비 우선 검색과 동일하지만 훨씬 적은 메모리를 사용합니다." 그것은 OP가 요구했던 것과 정확히 일치합니까? 그는 "여분의 메모리 오버 헤드없이"폭 넓은 우선 탐색을 원한다고 말했다. 큐를 사용하면 (다른 응답이 한 것처럼) 피하려고했던 것과 똑같은 것처럼 보입니다. –

+0

@JamesHolderness : 재귀 메서드는 [스택의 메모리]를 사용합니다 (http://stackoverflow.com/questions/4816159/stack-memory-use-with-arithmetic-and-recursive-function-call). 각각의 재귀 호출에서 적어도 4 개의 변수 + 함수 포인터와 아마도 지역 변수를 저장할 것이므로 다른 응답의 메소드보다 더 많은 메모리를 차지하십시오. 그것의 꼭대기에 그것은 O (n^2) 해결책이다 : -? – sowrov

2

sortedArrayToBST 메서드가 지정된 배열에서 균형 이진 트리를 작성하기를 바랍니다. 이 경우 구현하려는 메소드는 BST에 대한 DFS (Depth first search) 반복을 모방합니다. 그러나 구현이 버그는 올바른 구현은 다음과 같이 것입니다 :

void bstIterate(int[] array, int start, int end) { 
    if (start > end) return; 
    int mid = start + (end - start)/2; //it should not be array.lenght/2 because we are not updating the array at any point 

    bstIterate(array, start, mid-1); // mid is already printed so we no longer need it 
    bstIterate(array, mid+1, end); 
} 

//Now Call the method from you main 
bstIterate(array, 0, array.length-1); //it should be array.length-1, as it is the last index of last element of the array 

그러나 나는 당신을 이해하고 질문 제목에서

균형 이진 트리와 같은 배열을 가정하여 정렬 된 배열을 통해 BFS 탐색을 찾고 있습니다.

우리의 정렬 된 배열은 {1, 2, 3, 4, 5, 6, 7}이라고합시다. 이 경우 균형 잡힌 BST는 다음과 같이 표시됩니다

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

위의 나무에 BFS 탐색 정상적으로 출력은 다음과 같이 4 2 6 1 3 5 7 내가 할 것이다 이것에 대한 빠른 C++ 구현을 썼다

#include <stdio.h> 
#include <queue> 
using namespace std; 
class Node { 
public: 
    int start; 
    int end; 
}; 

void BFSiterate(int *arr, int start, int end) { 
    queue<Node>que; 
    Node n; 
    n.start = start; 
    n.end = end; 
    que.push(n); 

    while(!que.empty()) { 
     n = que.front(); 
     que.pop(); 
     int mid = n.start + (n.end - n.start)/2; 
     printf("%d\n", arr[mid]); 
     Node x; 
     x.start = n.start; 
     x.end = mid-1; 
     if (x.start<=x.end) 
      que.push(x); //left 

     x.start = mid+1; 
     x.end = n.end; 
     if (x.start<=x.end) 
      que.push(x); //right 
    } 
} 

int main() { 
    int arr[] = {1, 2, 3, 4, 5, 6, 7}; 
    int len = sizeof(arr)/4; 
    BFSiterate(arr, 0, len-1); 
    return 0; 
} 
+0

대기열에 범위를 추가하기 전에 더 많은 경계 검사가 필요할 수도 있습니다. 이 코드는 7 개의 아이템 배열 (완벽하게 균형 잡혀 있기 때문에)에서 잘 작동하지만, 다른 크기보다 더 자주 무한 루프를 생성합니다. –

+0

아, 지적 해 주셔서 고맙습니다, 지금 고쳐야합니다 :) – sowrov

+0

나는 여전히 뭔가 잘못되었다고 생각합니다. 배열'1,2,3,4,5,6 '을 사용하면'3 1 5 1 2 4 6'을 돌려 주는데 분명히 맞지 않습니다 (반복되는'1'을보십시오). –