이 튜토리얼에서는 루트 노드에서 주어진 바이너리 트리의 모든 리프 노드까지의 경로를 출력하는 프로그램에 대해 논의할 것입니다.
예를 들어 다음 이진 트리가 있다고 가정해 보겠습니다.

이 바이너리 트리에는 4개의 리프 노드가 있습니다. 따라서 루트 노드에서 리프 노드까지 4개의 경로를 가질 수 있습니다.
이를 해결하기 위해 반복적 접근 방식을 사용합니다. 이진 트리의 선주문 순회를 수행하는 동안 맵에 부모 포인터를 저장할 수 있습니다. 탐색 중에 리프 노드를 만날 때마다 부모 포인터를 사용하여 루트 노드에서 경로를 쉽게 인쇄할 수 있습니다.
예시
#include <bits/stdc++.h>>
using namespace std;
struct Node{
int data;
struct Node *left, *right;
};
//to create a new node
Node* create_node(int data){
Node* node = new Node;
node->data = data;
node->left = node->right = NULL;
return node;
}
//printing the path from root to leaf
void print_cpath(Node* curr, map<Node*, Node*> parent){
stack<Node*> nodes_stack;
while (curr){
nodes_stack.push(curr);
curr = parent[curr];
}
while (!nodes_stack.empty()){
curr = nodes_stack.top();
nodes_stack.pop();
cout << curr->data << " ";
}
cout << endl;
}
//to perform pre order traversal
void preorder_traversal(Node* root){
if (root == NULL)
return;
stack<Node*> nodeStack;
nodeStack.push(root);
map<Node*, Node*> parent;
parent[root] = NULL;
while (!nodeStack.empty()){
Node* current = nodeStack.top();
nodeStack.pop();
if (!(current->left) && !(current->right))
print_cpath(current, parent);
if (current->right){
parent[current->right] = current;
nodeStack.push(current->right);
}
if (current->left){
parent[current->left] = current;
nodeStack.push(current->left);
}
}
}
int main(){
Node* root = create_node(101);
root->left = create_node(82);
root->right = create_node(23);
root->left->left = create_node(34);
root->left->right = create_node(55);
root->right->left = create_node(29);
preorder_traversal(root);
return 0;
} 출력
101 82 34 101 82 55 101 23 29