Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++ 프로그래밍에서 재귀를 사용하지 않고 루트에서 리프 경로로 인쇄합니다.

<시간/>

이진 트리가 주어지면 프로그램은 루트에서 리프까지 여러 경로를 찾아야 하므로 모든 경로가 인쇄되어야 하지만 문제는 재귀를 사용하지 않는 것입니다.

재귀 없이 트리를 수행하는 것이 제약 조건이므로 트리를 반복적으로 탐색합니다. 따라서 이를 달성하기 위해 루트 요소를 저장할 STL 맵을 사용할 수 있으며 레벨 순서 순회를 통해 리프 노드가 식별될 때마다 루트 노드를 가리키는 맵 포인터가 있으므로 루트에서 리프까지의 경로를 인쇄합니다.

C++ 프로그래밍에서 재귀를 사용하지 않고 루트에서 리프 경로로 인쇄합니다.

위의 트리에는 루트에서 리프까지 도달하기 위해 생성될 수 있는 여러 경로가 있습니다 -

10 -> 3 -> 140
10 -> 3 -> 162
10 -> 211 -> 100
10 -> 211 -> 146

따라서 프로그램은 주어진 모든 경로를 주어진 이진 트리의 출력으로 인쇄해야 합니다.

알고리즘

START
Step 1 -> create a structure of a node as
   struct Node
      struct node *left, *right
      int data
   End
Step 2 -> function to create a node
   node* newnode(int data)
   node->data = data
   node->left = node->right = NULL;
   return (node)
Step 3 -> create function to calculate the path
   void calculatePath(Node* curr, map<Node*, Node*> first)
   create STL stack<Node*> stk
   Loop While (curr)
      stk.push(curr)
      curr = first[curr]
   End
   Loop While !stk.empty()
      curr = stk.top()
      stk.pop()
      print curr->data
   End
Step 4 -> create function to find the leaf nodes
   void leaf(Node* root)
   IF root = NULL
      Return
   End
   Create STL stack<Node*> stc
   stc.push(root)
   Create STL map<Node*, Node*> prnt
   prnt[root] = NULL
   Loop while !stc.empty()
      Node* curr = stc.top()
      stc.pop()
      IF!(curr->left) && !(curr->right)
         calculatePath(curr, prnt)
      End
      IF curr->right
         prnt[curr->right] = curr
         stc.push(curr->right)
      End
      IF curr->left
         prnt[curr->left] = curr
         stc.push(curr->left)
      End
   End
STOP

예시

#include <bits/stdc++.h>
using namespace std;
//structure of a node
struct Node{
   int data;
   struct Node *left, *right;
};
//function to create a new node
Node* newNode(int data){
   Node* node = new Node;
   node->data = data;
   node->left = node->right = NULL;
   return node;
}
//this function will calculate the path
void calculatePath(Node* curr, map<Node*, Node*> first){
   stack<Node*> stk;
   while (curr){
      stk.push(curr);
      curr = first[curr];
   }
   while (!stk.empty()){
      curr = stk.top();
      stk.pop();
      cout << curr->data << " ";
   }
   cout << endl;
}
//this function will lead to the leafs
void leaf(Node* root){
   if (root == NULL)
      return;
   stack<Node*> stc;
   stc.push(root);
   map<Node*, Node*> prnt;
   prnt[root] = NULL;
   while (!stc.empty()){
      Node* curr = stc.top();
      stc.pop();
      if (!(curr->left) && !(curr->right))
         calculatePath(curr, prnt);
      if (curr->right){
         prnt[curr->right] = curr;
         stc.push(curr->right);
      }
      if (curr->left){
         prnt[curr->left] = curr;
         stc.push(curr->left);
      }
   }
}
int main(){
   Node* root = newNode(67); //it will insert the nodes to create a tree
   root->left = newNode(34);
   root->right = newNode(89);
   root->left->left = newNode(23);
   root->left->right = newNode(95);
   root->right->left = newNode(12);
   leaf(root); //call the function leaf
   return 0;
}

출력

위의 프로그램을 실행하면 다음 출력이 생성됩니다.

67 34 23
67 34 95
67 89 12