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

C++에서 상대 위치가 있는 모든 루트에서 리프 경로로 인쇄

<시간/>

이 문제에서는 이진 트리가 제공됩니다. 그리고 루트에서 트리의 리프까지의 모든 경로를 인쇄해야 합니다. 또한 밑줄 "_"을 추가하여 노드의 상대적 위치를 표시합니다.

주제를 더 잘 이해하기 위해 예를 들어 보겠습니다 -

입력 -

C++에서 상대 위치가 있는 모든 루트에서 리프 경로로 인쇄

출력 -

_ _ 3
_ 9
1
_3
9
_7
3
_ 4
_ _ 2
3
9 4
1 7 6 2
3
_ 4
6

이 문제를 해결하기 위해 트리 요소의 수직 순서 개념을 사용합니다.

C++에서 상대 위치가 있는 모든 루트에서 리프 경로로 인쇄

이를 기반으로 루트에서 리프까지의 경로를 인쇄합니다.

알고리즘

Step 1: Traverse the binary tree using preorder traversal. And on traversal calculate the horizontal distance based on the order. The horizontal distance of root is 0 and processed as the above diagram.
Step 2: And on traversing to the leaf node, print the path with an underscore “_” at the end.

예시

#include<bits/stdc++.h>
using namespace std;
#define MAX_PATH_SIZE 1000
struct Node{
   char data;
   Node *left, *right;
};
Node * newNode(char data){
   struct Node *temp = new Node;
   temp->data = data;
   temp->left = temp->right = NULL;
   return temp;
}
struct PATH{
   int horizontalDistance;
   char key;
};
void printPath(vector < PATH > path, int size){
   int minimumhorizontalDistance = INT_MAX;
   PATH p;
   for (int it=0; it<size; it++){
      p = path[it];
      minimumhorizontalDistance = min(minimumhorizontalDistance, p.horizontalDistance);
   }
   for (int it=0; it < size; it++){
      p = path[it];
      int noOfUnderScores = abs(p.horizontalDistance -minimumhorizontalDistance);
      for (int i = 0; i < noOfUnderScores; i++) cout<<"_ ";
         cout<<p.key<<endl;
   }
   cout<<"\nNext Path\n";
}
void printAllRtLPaths(Node *root, vector < PATH > &AllPath, int horizontalDistance, int order ){
   if(root == NULL)
      return;
   if (root->left == NULL && root->right == NULL){
      AllPath[order] = (PATH { horizontalDistance, root->data });
      printPath(AllPath, order+1);
      return;
   }
   AllPath[order] = (PATH { horizontalDistance, root->data });
   printAllRtLPaths(root->left, AllPath, horizontalDistance-1, order+1);
   printAllRtLPaths(root->right, AllPath, horizontalDistance+1, order+1);
}
void printRootToLeafPath(Node *root){
   if (root == NULL)
      return;
   vector<PATH> Allpaths(MAX_PATH_SIZE);
   printAllRtLPaths(root, Allpaths, 0, 0);
}
int main(){
   Node *root = newNode('3');
   root->left = newNode('9');
   root->right = newNode('4');
   root->left->left = newNode('1');
   root->left->right = newNode('7');
   root->right->left = newNode('6');
   root->right->right = newNode('2');
   printRootToLeafPath(root);
   return 0;
}

출력

_ _ 3
_ 9
1
Next Path
_ 3
9
_ 7
Next Path
3
_ 4
6
Next Path
3
_ 4
_ _ 2