用C++構造其先序遍歷的完整k叉樹


給定一個數組arr[],其中包含k叉樹的先序遍歷序列。目標是從該序列構造相同的k叉樹,並列印其後序遍歷。一個完整的k叉樹是指根節點有0個或k個子節點的樹,即最多k個子節點。

例如

輸入

int arr[] = {2, 5, 1, 3, 6, 7, 2, 1 }, int size = 8, int children = 2

輸出

根據先序遍歷,構造的具有兩個子節點的完整k叉樹如下:

解釋

我們得到一個整數陣列,或者是一個具有k個子節點(k=2)的樹的先序遍歷。因此,生成的樹的後序遍歷為3 6 1 2 1 7 5 2,其構造規則是:先訪問所有左子樹節點,然後訪問所有右子樹節點,最後訪問根節點。

輸入

int arr[] = {2, 5, 1, 3, 6, 7, 2, 1 }, int size = 8, int children = 3

輸出

根據先序遍歷,構造的具有三個子節點的完整k叉樹如下:

解釋

我們得到一個整數陣列,或者是一個具有k個子節點(k=3)的樹的先序遍歷。因此,生成的樹的後序遍歷為3 6 1 2 1 7 5 2,其構造規則是:先訪問所有左子樹節點,然後訪問所有右子樹節點,最後訪問根節點。

**下面程式中使用的方法如下:**

在這種方法中,我們將首先從給定陣列構造k叉樹,並將第一個元素作為根節點。如果左子樹為空,則右子樹也為空。遞迴呼叫左子樹和右子樹,並將它們連線起來。對於後序遍歷,我們先訪問左子樹,然後訪問右子樹,最後列印節點的值。

  • 呼叫postorder(root->left)

  • 呼叫postorder(root->right)

  • 列印root->data

  • 將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[]生成k叉樹。

  • 如果節點數<=0,則返回NULL,無法構造樹。

  • 初始化newNode = new_Node(arr[count]),即arr[]的第一個元素。

  • 如果(newNode == NULL)結果為真,則無法構造樹。

  • 使用for迴圈遍歷arr[],從i=0到i

  • 如果(count < N - 1 && height > 1),則為下一個索引遞增count,並使用newNode->root.push_back(create_tree(arr, N, k, height - 1, count))將此節點新增到樹中。

  • 否則,透過推送NULL來結束樹,使用newNode->root.push_back(NULL);

  • 最後返回指向節點的指標。

  • 函式create_tree(int* arr, int N, int k, int count)返回樹的高度。

  • 計算height= (int)ceil(log((double)N * (k - 1) + 1) / log((double)k));

  • 在return語句中呼叫create_tree(arr, N, k, height, count)以生成上面計算高度的樹。

  • 函式postorder_traversal(Tree_Node* node, int k)列印以node為根節點的k叉樹的後序遍歷。

  • 如果節點為NULL,則不返回任何內容。

  • 使用for迴圈遍歷,從i=0到iroot[i], k);

  • 在for迴圈結束時列印node->address。

示例

線上演示

#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

更新於:2021年1月7日

355 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告