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

C++에서 주어진 Inorder 순회로부터 특수 이진 트리 생성


이진 트리의 중위 순회를 포함하는 배열 arr[]이 제공됩니다. 목표는 해당 배열에서 특수 이진 트리를 구성하는 것입니다. 특수 이진 트리는 루트 노드의 가중치가 왼쪽 및 오른쪽 자식의 가중치보다 큰 것입니다.

예를 들어

입력

int arr[] = {10, 20, 28, 40, 32, 31, 30}

출력

주어진 inordertraversal로 생성될 특별한 이진 트리는 다음과 같습니다 -

C++에서 주어진 Inorder 순회로부터 특수 이진 트리 생성

설명

we are given with an array of integer values or the inorder traversal of a tree. So, the special tree formed is 10, 20, 28, 40, 32, 31, 30

입력

int arr[] = {10, 20, 25, 28, 40, 32, 31, 30, 35}

출력

The special binary tree which will be constructed with the given inorder
traversal is given below −

C++에서 주어진 Inorder 순회로부터 특수 이진 트리 생성

설명

we are given with an array of integer values or the inorder traversal of a tree. So, the special tree formed is 10, 20, 25, 28, 40, 32, 31, 30, 35.

아래 프로그램에서 사용된 접근 방식은 다음과 같습니다. -

이 접근 방식에서는 최대 요소를 루트 노드로 사용하여 주어진 배열에서 특수 이진 트리를 구성합니다. 왼쪽 요소는 왼쪽 하위 트리의 일부가 되고 오른쪽 요소는 오른쪽 하위 트리의 일부가 됩니다. 이 프로세스는 트리를 구성하기 위해 재귀적으로 수행됩니다.

  • inorder traversal을 포함하는 입력 배열로 arr[]을 사용합니다.

  • 함수 new_node(int 데이터)는 왼쪽 및 오른쪽 자식이 NULL인 노드를 생성합니다.

  • total(int arr[], int first, int last) 함수는 해당 요소의 인덱스를 반환합니다.

  • 가장 높은 =arr[첫 번째] 및 가장 낮은 =첫 번째를 취합니다.

  • 첫 번째 + 1 인덱스에서 마지막 인덱스까지 순회하고 요소 arr[i]가 가장 높은 것보다 많이 발견되면 해당 인덱스를 가장 낮은 위치에 저장하고 가장 높은 값을 업데이트합니다.

  • for 루프의 끝에서 가장 낮은 요소는 가장 높은 요소의 인덱스를 포함합니다.

  • 함수 create_tree(int arr[], int first, int last)는 arr[]에서 재귀적으로 특수 이진 트리를 생성합니다.

  • first>last이면 트리가 불가능하므로 NULL을 반환합니다.

  • temp =total(arr, first, last)를 사용하여 배열의 최대값으로 temp를 취합니다.

  • temp를 데이터로 사용하여 노드를 만들고 포인터 부모가 트리의 루트 노드에 대한 포인터를 가리키도록 합니다.

  • first==last이면 트리에는 노드가 하나만 있습니다. 부모를 반환합니다.

  • 재귀적으로 parent->left =create_tree(arr, first, temp − 1);

    를 재귀적으로 계산합니다.
  • 그리고 parent->right =create_tree(arr, temp + 1, last).

  • 마지막에 부모를 반환합니다.

  • Inorder_traversal(tree_node* node) 함수는 위에서 생성된 트리의 중위 순회를 출력합니다.

  • 노드가 NULL이면 아무 것도 반환하지 않습니다. 그렇지 않으면 Inorder_traversal(node−>left)을 사용하여 왼쪽 하위 트리를 먼저 인쇄합니다.

  • 그런 다음 현재 노드를 인쇄합니다.

  • 그런 다음 Inorder_traversal(node->right)을 사용하여 오른쪽 하위 트리를 인쇄합니다.

예시

#include <bits/stdc++.h>
using namespace std;
int total(int arr[], int first, int last);
class tree_node{
   public:
   int data;
   tree_node* left;
   tree_node* right;
};
tree_node* new_node(int data);
tree_node* create_tree (int arr[], int first, int last){
   if(first > last){
      return NULL;
   }
   int temp = total(arr, first, last);
   tree_node *parent = new_node(arr[temp]);
   if(first == last){
      return parent;
   }
   parent−>left = create_tree(arr, first, temp − 1);
   parent−>right = create_tree(arr, temp + 1, last);
   return parent;
}
int total(int arr[], int first, int last){
   int highest = arr[first];
   int lowest = first;
   for(int i = first + 1; i <= last; i++){
      if(arr[i] > highest){
         highest = arr[i];
         lowest = i;
      }
   }
   return lowest;
}
tree_node* new_node (int data){
   tree_node* newNode = new tree_node();
   newNode−>data = data;
   newNode−>left = NULL;
   newNode−>right = NULL;
   return newNode;
}
void Inorder_traversal(tree_node* node){
   if (node == NULL){
      return;
   }
   Inorder_traversal(node−>left);
   cout<<node−>data<<" ";
   Inorder_traversal (node−>right);
}
int main(){
   int arr[] = {10, 20, 28, 40, 32, 31, 30};
   int size = sizeof(arr)/sizeof(arr[0]);
   tree_node *root = create_tree(arr, 0, size − 1);
   cout<<"Construct Special Binary Tree from given Inorder traversal are: "<<"\n";
   Inorder_traversal(root);
   return 0;
}

출력

위의 코드를 실행하면 다음 출력이 생성됩니다 -

Construct Special Binary Tree from given Inorder traversal are:
10, 20, 28, 40, 32, 31, 30