2016-11-26 2 views
1

선 주문 트리 순회를 통해 배열을 채우려 고 시도하고 있습니다.하지만이 배열을 유지하는 방법을 실수로 생각합니다. 카운터가 올바르다. 내 toString() 메서드는 preorder 메서드를 호출하지만 null 만 출력합니다. 이 문제를 어떻게 해결할 수 있습니까? count++preorder의 후속 호출에 count의 실제 값이 메서드에 전달되고 나중에count이 증가하기 때문에BST에서 배열을 채울 때 재귀 적 메서드를 통해 카운트를 유지하는 방법

public AVLTreeNode[] preorder() 
{ 
    /* 
    * return an array of AVLTreeNodes in preorder 
    */ 
    AVLTreeNode[] preorder = new AVLTreeNode[size]; 
    int count = 0; 
    return preorder(root, count, preorder); 
} 

private AVLTreeNode[] preorder(AVLTreeNode data, int count, AVLTreeNode preorder[]) 
{ 
    if (data == null) 
    { 
     return preorder; 
    } 
    preorder[count] = data; 
    if (data.getLeft() != null) 
    { 
     preorder(data.getLeft(), count++, preorder); 
    } 
    if (data.getRight() != null) 
    { 
     preorder(data.getRight(), count++, preorder); 
    } 
    return preorder; 
} 

답변

0

count 잘못된 값이 있습니다. 또한 왼쪽 노드에서 돌아온 후 count은 올바른 노드에 대한 호출에 전달하는 값보다 높은 값을 가질 가능성이 큽니다.

  1. 글로벌 private int count;을 사용 preorder를 호출하기 전에 0로 설정 두 가지 해결책이 있습니다.

  2. AVLTreeNode[] 대신 새 count을 반환하고 올바른 값을 얻기 위해 메서드의 로컬 count에 할당하십시오. AVLTreeNode[] preorder은 개인 변수 일 수도 있습니다.

+0

이제 출력이 나오지만 올바른 것은 아닙니다. 입력은 {3,1,5,2}로, 결과는 {3,1,5, null}입니다. 나는 나무에 2라는 값이 들어 있는지 확인했다. 왜 1의 올바른 아이를 놓칠까요? – scraig