2013-08-24 4 views
1

내가 원하는 것은 이진 트리에서 노드를 순서대로 인쇄 할 수 있도록 노드를 순서대로 트래버스하는 것입니다.C++ 이진 트리 트래버스 및 함수 포인터 매개 변수

이 코드는 inorder가 이진 트리를 가로 지르는 것을 보았습니다. 순회는 모든 노드를 거치므로 모든 순회 노드의 모든 데이터를 순회 기능을 사용하여 인쇄 할 수 있다고 생각했습니다. 작동할까요? 나는 매우 다형 함수 매개 변수에 전달해야 할 것을 혼란 스럽다.

다음과 같이 이진 트리를 구성하고 트리의 모든 데이터를 트래버스하고 인쇄하려고하면 위의 inorder_traverse 함수에 무엇을 전달해야합니까?

struct node* root = new node(NULL); 
    root->data = 10; 
    root = insertion(root, 1); 
    root = insertion(root, 11); 
    root = insertion(root, 2); 
    root = insertion(root, 12); 
    root = insertion(root, 3); 
    root = insertion(root, 13); 
    root = insertion(root, 5); 
    root = insertion(root, 20); 
    root = insertion(root, 7); 
    root = insertion(root, 15); 

THanks, 나는 크게 감사하겠습니다.

답변

1

당신이, 즉 표준 출력 노드 값을 보내는 탐색 기능에서 무엇을하고 있는지 고려하고, 어떻게이 대신 콜백 함수에서 수행 할 수 : 그래서 당신은 단순히 데이터를 인쇄로 전화를 대체 할 수있다 각 호출마다 방문한 노드를 가져옵니다. 이는 visit 함수 객체로 수행 할 수있는 작업입니다. 이것의 예는 다음과 같습니다

void print_node_value(node *p) 
{ 
    std::cout << p->data << ' '; 
} 

지금 당신의 중위 순회 단순히이된다 :

void inorder_traverse(node* root, std::function<void(node*)> visit) 
{ 
    if (root == nullptr) 
     return; 

    inorder_traverse(root->left, visit); 
    visit(root); // <<== calls provided function object 
    inorder_traverse(root->right, visit); 
} 

을 그리고 같은 호출 :

inorder_traverse(root, std::function<void(node*)>(print_node_value)); 

참고 :이 정말 그랜드 아니다 디자인. 원래 작성자가 C++ 환경에서 래핑 된 C- 콜백 메커니즘을 사용하려고 시도하는 것 같습니다. 그러나 그것이 지금 어떻게 작동하는지 당신이 이해하기를 바랍니다.

+0

감사합니다 !!!!!!!!!! 그것은 나에게 백만을 돕는다! –

1

"현재"노드로 수행하려는 작업을 수행하기 만하면됩니다.

void inorder_traverse(node* root) 
{ 
    if (root == nullptr) return; 

    inorder_traverse(root->left); 
    cout << root->data << ", "; 
    inorder_traverse(root->right); 
} 
+0

그래, 내 잘못, 그 인수를 변경하는 것을 잊어 버렸지 만, 변경된 사항은 작동해야합니다. 나는 그에게 그의 방문 목적을 위해 여분의 것으로 보였으므로 방문 만 제거했습니다. –

+0

감사합니다.하지만 순서대로 트래버스하고 싶었습니다. 질문을 수정하겠습니다. –

+0

@ dfsadxsadqwd213 나무가 왼쪽에서 오른쪽으로 정렬되었다고 가정하면 –