列印二叉樹的所有素數層
在這個問題中,我們將列印給定二叉樹的所有素數層。
我們將使用層序遍歷技術遍歷每個二叉樹層,並檢查特定層的所有節點是否包含素數。
問題陳述 - 我們給定一個二叉樹,需要列印二叉樹的所有素數層。如果二叉樹的任何一層的所有節點都包含素數,則可以稱該層為素數層。
示例
輸入
23 / \ 12 13 / \ \ 17 19 23 / \ \ / 3 7 19 11
輸出
23 17 19 23 3 7 19 11
解釋 - 我們列印了給定二叉樹的所有素數層。
輸入
5 / \ 7 2 / \ / \ 3 5 74 76 / \ 23 1 7
輸出
5 7 2 23 17
解釋 -第一、第二和第四層是素數層。
方法 1
在這種方法中,我們將遍歷每一層。之後,我們將檢查特定層的所有數字是否為素數。如果是,則列印該層。
演算法
步驟 1- 定義樹的結構。
步驟 2- 定義 createNewNode() 函式以使用給定值建立一個新節點。
步驟 3- 建立一個二叉樹。
步驟 4- 執行 getSize() 函式以獲取樹中層數的數量。
步驟 4.1- 在 getSize() 函式中,如果頭節點為 NULL,則返回 0。
步驟 4.2- 否則,對左節點和右節點進行遞迴呼叫,並將 1 加到其結果值中。
步驟 5- 建立一個長度等於樹大小的佇列,並將頭節點插入佇列中。
步驟 6- 執行 getPrimeLevels() 函式以列印素數層。
步驟 6.1- 在 getPrimeLevels() 函式中,執行 checkForPrime() 函式以檢查根元素是否為素數。
步驟 6.1.1- 在 checkForPrime() 函式中,如果數字為 1,則返回 false。
步驟 6.1.2- 使用 for 迴圈進行迭代,直到 p*p <= num。在迴圈中,如果 num 可以被 p 整除,則返回 false。
步驟 6.1.3- 最後返回 false。
步驟 6.2- 現在,使用 while 迴圈遍歷每一層。
步驟 6.3- 使用巢狀的 while 迴圈遍歷特定層。
步驟 6.3.1- 在巢狀迴圈中,從佇列中取出第一個節點。
步驟 6.3.2- 如果當前節點的左子節點存在,則將其插入佇列中。
步驟 6.3.3- 如果當前節點的右節點存在,則將其插入佇列中。
步驟 6.3.4- 將 'ind' 值增加 1。
步驟 6.4- 執行 checkForPrimeLevel() 函式以檢查當前層是否為素數層。
步驟 6.4.1- 在 checkForPrimeLKevel() 函式中,我們檢查每個數字是否為素數。如果是,則返回 true。否則,返回 false。
步驟 6.5- 如果 checkForPrimeLevel() 函式返回 true,則執行 showLevel() 函式以顯示當前層。其中,我們遍歷包含當前層節點的佇列並列印其值。
示例
#include <bits/stdc++.h> using namespace std; // Tree structure struct TreeNode { int val; struct TreeNode *left, *right; }; // Function for creating a new node TreeNode *createNewNode(int val) { TreeNode *tmp = new TreeNode; tmp->val = val; tmp->left = NULL; tmp->right = NULL; return (tmp); } // Check if a number is Prime or not bool checkForPrime(int num) { if (num == 1) return false; for (int p = 2; p * p <= num; p++) { if (num % p == 0) { return false; } } return true; } // Print the particular level of a given void showLevel(struct TreeNode *que[], int ind, int sz) { // Traverse the queue and print all values for (int p = ind; p < sz; p++) { cout << que[p]->val << " "; } cout << endl; } // Check if a particular level is Prime bool checkForPrimeLevel(struct TreeNode *que[], int ind, int sz) { for (int p = ind; p < sz; p++) { if (!checkForPrime(que[ind++]->val)) { return false; } } // When all node values are Prime return true; } void getPrimeLevels(struct TreeNode *head, struct TreeNode *que[], int ind, int sz) { // Print head node if (checkForPrime(que[ind]->val)) { cout << que[ind]->val << endl; } while (ind < sz) { int temp_size = sz; while (ind < temp_size) { struct TreeNode *temp = que[ind]; // Insert left child to queue if (temp->left != NULL) que[sz++] = temp->left; // Insert right child to queue if (temp->right != NULL) que[sz++] = temp->right; ind++; } // Check for prime level if (checkForPrimeLevel(que, ind, sz - 1)) { showLevel(que, ind, sz); } } } // Get the size of the tree int getSize(struct TreeNode *head) { // Base condition if (head == NULL) return 0; return 1 + getSize(head->left) + getSize(head->right); } void ShowAllPrimeLevels(struct TreeNode *head) { int treeSize = getSize(head); struct TreeNode *queue[treeSize]; // Insert head node in queue queue[0] = head; // FInd prime levels getPrimeLevels(head, queue, 0, 1); } int main() { TreeNode *head = createNewNode(5); head->left = createNewNode(7); head->right = createNewNode(2); head->left->left = createNewNode(3); head->left->right = createNewNode(5); head->right->left = createNewNode(76); head->right->right = createNewNode(54); head->left->left->left = createNewNode(23); head->left->left->right = createNewNode(17); ShowAllPrimeLevels(head); return 0; }
輸出
5 7 2 23 17
時間複雜度 - O(n * sqrt(max_val)),其中 O(n) 用於遍歷二叉樹,O(sqrt(max_val)) 用於檢查數字是否為素數。
空間複雜度 - O(M),其中 M 是特定層中節點的最大數量。
在這裡,我們使用層序遍歷列印了所有素數層。程式設計師可以列印非素數層。他們可以在特定層的所有節點都包含非素數時列印該層。