2012-03-08 3 views
-1

재귀 inorder 이진 검색 트리 순회에서 이전 노드를 추적하는 방법?inorder 순회 BST

eq ... ... bst ... 내에서 주어진 값보다 큰 bst의 첫 번째 숫자를 찾으려고합니다. 그 시점에서 이전의 데이터를 인쇄합니다. 동일하거나 탐색 inorder를 그대로 주어진 값 적은 다음 중 하나입니다 노드 ...

그래서 질문은 우리가 통과 중위 재귀에 BST에서 이전 노드를 추적 할 수있는 방법을 왜 ??

+1

재귀 적 inorder 순회에서 이전 노드를 추적해야하는 이유는 무엇입니까? – Philip

+0

내 임무는 바닥을 찾는 것입니다. 예를 들어 1,4,7,9,14,16이 12 층보다 inorder에있는 경우 9 ... 그래서 첫 번째 번호를 찾습니다. 어떤 주어진 값보다 14보다 큰 값입니다. 그래서 대답은 우리가 이전 노드를 inorder ... 즉 9라고합니다. 그래서 나는 어떻게 우리가 이전 노드를 추적 할 수 있는지 물어보고 싶습니다. – Ernie

답변

1

이진 트리 재귀는 왼쪽 트리를 누른 다음 오른쪽으로 이동하여 작동합니다. Inorder/preorder/postorder는 재귀 적 프로 시저에서 일부 로컬 작업의 순서에 따라 결정되는 규칙입니다. 두 개의 재귀 호출과 관련하여 현재 노드 자체의 "방문"타이밍입니다.

다음 노드를 얻는 방법은 재귀가 반환하도록하는 것입니다.

트리로 돌아갈 때 "inorder"에서 마지막으로 방문한 노드는 단순히 맨 오른쪽 노드입니다. 따라서 재귀는 가장 오른쪽 노드 만 리턴해야합니다.

또한, 전체적으로 트리 T가 이전 노드 P를 갖는 경우, T의 좌측 서브 트리, 즉 좌측 (T)도 동일한 이전 노드 P를 갖는다. P는 T의 가장 좌측 노드의 전신이다.

또한 오른쪽 (T)에 대한 이전 노드는 노드 T 자체입니다.

그래서 왼쪽으로 재귀 (T) 할 때 우리는 단순히 우리에게 주어진 전임자를 거절 할 수 있습니다. 그리고 오른쪽으로 재귀 (T) 할 때 우리는 전임자로서 자신을 전달합니다.

의사 코드 : 제외

# a recursive function that is given its previous node, 
# and returns the rightmost node 

recurse_with_previous (tree previous-in): 
    # skip empty link. No leaf to see here! 
    # previous-in is the rightmost node still 
    if null(tree) 
     return previous-in 

    # if we are at a leaf, then that leaf is rightmost 
    if leaf(tree) 
     print "visiting leaf node " tree " with previous node " previous-in 
     return tree 

    # the previous node (previous-in) of this tree is actually the left 
    # subtrees previous node, so we just pass that parameter down 
    previous = recurse_with_previous (left(tree) previous-in) 

    # inorder visit: visit this node between the subtrees 
    print "visiting " tree " with previous node " previous 

    # now the right subtree. what is ITS previous? Why, we are!!! 
    # we return whatever this returns causing the return value 
    # to be the rightmost node. 
    return recurse_with_previous (right(tree) tree) 

# how to call 
recurse_with_previous(some-tree nil) 
+0

나는이 사이트를 좋아합니다. 의사 코드 언어를 작성하고 그 자리에서 구문 강조를 얻습니다. – Kaz

1

(: 그것은 당신이에서 주문 통과를 요구하고 같은 소리지만,보다 더없는 가장 큰 노드를 반환하지 않고 이진 검색 기능하지 않습니다 쿼리).

재귀 알고리즘에서 이와 같은 정보를 추적하는 가장 일반적인 두 가지 방법은 매개 변수로 전달하거나 다시 반환하는 것입니다. (어느 쪽이든 과거에 대한 정보를 스택에 저장하고 있습니다.)

아마도 가장 후자를 수행하는 것이 가장 좋습니다. 예 :

Node* floor_node(int x, Node *subtree) { 
    if (subtree) { 
    if(subtree->value > x) { 
     return floor_node(x, subtree->left); 
    } else { 
     return floor_node(x, subtree->right) || subtree; 
    } 
    } else { 
     return subtree; 
    } 
} 
+0

... 전 사건의 발췌문을 줄 수 있어요 .... – Ernie