k-ary 트리의 사전 순회를 순서대로 포함하는 배열 arr[]이 제공됩니다. 목표는 그것으로부터 동일한 k-ary 트리를 구성하고 그것의 후위 순회를 인쇄하는 것입니다. 전체 k-ary 트리는 루트 노드가 0 또는 k 자식, 즉 최대 k 자식을 갖는 트리입니다.
예를 들어
입력
int arr[] = {2, 5, 1, 3, 6, 7, 2, 1 }, int size = 8, int children = 2
출력
preorder traversal에서 두 개의 자식으로 구성될 전체 k-ary 트리는 다음과 같습니다. -
설명
우리는 정수 값의 배열 또는 k 자식이 2인 트리의 사전순 순회가 제공됩니다. 따라서 형성된 트리는 다음 규칙에 따라 구성된 후위 순회를 3 6 1 2 1 7 5 2로 갖게 됩니다. 모든 LEFT 하위 트리 노드를 방문한 다음 모든 RIGHT 하위 트리 노드를 방문한 다음 모든 ROOT 노드를 방문합니다.
입력
int arr[] = {2, 5, 1, 3, 6, 7, 2, 1 }, int size = 8, int children = 3
출력
preorder traversal에서 세 개의 자식으로 구성될 전체 k-ary 트리는 다음과 같습니다. -
설명
우리는 정수 값의 배열 또는 3인 k 자식이 있는 트리의 사전순 순회가 제공됩니다. 따라서 형성된 트리는 다음 규칙에 따라 구성되는 3 6 1 2 1 7 5 2와 같은 후위 순회를 갖습니다. 모든 LEFT 하위 트리 노드를 방문한 다음 모든 RIGHT 하위 트리 노드를 방문한 다음 모든 ROOT 노드를 방문합니다.
아래 프로그램에서 사용된 접근 방식은 다음과 같습니다. -
이 접근 방식에서는 먼저 첫 번째 요소를 루트 노드로 사용하여 주어진 배열에서 k-ary 트리를 구성합니다. 왼쪽 하위 트리가 비어 있으면 오른쪽 하위 트리도 비어 있습니다. 왼쪽 및 오른쪽 하위 트리를 재귀적으로 호출하고 연결합니다. 후위 순회를 위해 왼쪽 하위 트리, 오른쪽 하위 트리를 선택한 다음 노드의 가중치를 인쇄합니다.
-
postorder(루트->왼쪽)
호출 -
postorder 호출(root−>right)
-
루트->데이터
인쇄 -
사전 주문 순회를 포함하는 입력 배열로 arr[]을 사용합니다.
-
k를 변수 자식으로 사용합니다.
-
시작 인덱스를 count=0으로 사용합니다.
-
Tree_Node* node =create_tree(arr, size, children, count)를 사용하여 트리를 구성합니다.
-
함수 new_Node(int data)는 트리의 새 노드를 생성합니다.
-
함수 create_tree(int arr[], int N, int k, int height, int&count)는 배열 arr[]에서 kary 트리를 생성합니다.
-
노드 수가 <=0이면 NULL을 반환하면 트리를 구성할 수 없습니다.
-
newNode =new_Node(arr[count]), arr[]의 첫 번째 요소를 초기화합니다.
-
(newNode ==NULL) 결과가 true이면 트리가 불가능합니다.
-
for 루프를 사용하여 i=0에서 i
로 트래버스 -
(count
1)이면 다음 인덱스의 카운트를 증가시키고 newNode−>root.push_back(create_tree(arr, N, k, height − 1, count))를 사용하여 이 노드를 트리에 추가합니다.피> -
그렇지 않으면 newNode−>root.push_back(NULL);
을 사용하여 NULL을 푸시하여 트리를 종료하십시오. -
끝에서 노드에 대한 포인터를 반환합니다.
-
create_tree(int* arr, int N, int k, int count) 함수는 트리의 높이를 반환합니다.
-
계산 높이=(int)ceil(log((double)N * (k − 1) + 1) / log((double)k));
-
위에서 계산한 height에 있는 tree에 대한 return 문에서 create_tree(arr, N, k, height, count)를 호출합니다.
-
함수 postorder_traversal(Tree_Node* node, int k)는 노드에 뿌리를 둔 k-ary 트리의 preordertraversal을 출력합니다.
-
노드가 NULL이면 아무 것도 반환하지 않습니다.
-
for 루프를 사용하여 i=0에서 i
root[i], k); -
노드->for 루프 끝에 있는 주소를 인쇄합니다.
예시
#include <bits/stdc++.h> using namespace std; struct Tree_Node{ int address; vector<Tree_Node*> root; }; Tree_Node* new_Node(int data){ Tree_Node* newNode = new Tree_Node; newNode−>address = data; return newNode; } Tree_Node* create_tree(int arr[], int N, int k, int height, int& count){ if(N <= 0){ return NULL; } Tree_Node* newNode = new_Node(arr[count]); if (newNode == NULL){ cout<<"Code Dumped"; return NULL; } for(int i = 0; i < k; i++){ if (count < N − 1 && height > 1){ count++; newNode−>root.push_back(create_tree(arr, N, k, height − 1, count)); }else{ newNode−>root.push_back(NULL); } } return newNode; } Tree_Node* create_tree(int* arr, int N, int k, int count){ int height = (int)ceil(log((double)N * (k − 1) + 1) / log((double)k)); return create_tree(arr, N, k, height, count); } void preorder_traversal(Tree_Node* node, int k){ if (node == NULL){ return; } for(int i = 0; i < k; i++){ preorder_traversal(node−>root[i], k); } cout<<node−>address<< " "; } int main(){ int arr[] = {2, 5, 1, 3, 6, 7, 2, 1 }; int size = 8; int children = 2; int count = 0; Tree_Node* node = create_tree(arr, size, children, count); cout<<"Construct the full k−ary tree from its preorder traversal are: "; preorder_traversal(node, children); return 0; }
출력
위의 코드를 실행하면 다음 출력이 생성됩니다 -
Construct the full k-ary tree from its preorder traversal are: 3 6 1 2 1 7 5 2