從給定的 N 個節點的非迴圈圖構建一棵素數二叉樹
介紹
在程式設計和資料結構領域,二叉樹被廣泛用於高效地儲存和檢索資料。本文將探討使用 C++ 程式碼從給定的由 N 個節點組成的非迴圈圖構建素數二叉樹的概念。二叉樹可以從非迴圈圖構建,此類圖的型別包括樹、有向無環圖等等。素數樹屬於二叉樹的一個分支,透過附加圖的兩個連續邊來返回素數。
從給定的非迴圈圖構建素數二叉樹
素數二叉樹是普通二叉搜尋樹 (BST) 的一個有趣變體。在 BST 中,每個節點有兩個子節點:一個位於其左側,值較小;另一個位於其右側,值較大。素數二叉樹採用了這個概念,但附加了一個約束條件:左子樹中的每個節點都必須小於右子樹中的任何節點。
示例
在上圖的二叉樹中,根節點選擇為節點 0,它有兩個子節點,左子節點為 1,右子節點為 2。左子節點進一步有兩個子節點,分別為節點 3 和節點 4。由此構建的素數二叉樹為 0 2 5。
方法 1:使用 C++ 程式碼從給定的 N 個節點的非迴圈圖構建素數二叉樹
我們首先包含必要的標準 C++ 庫,例如 iostream。然後建立節點和圖的類,以有效地表示結構。
演算法
步驟 1 − 建立一個 Node 類,其中包含三個成員:index、leftChild 和 rightChild。
步驟 2 − 建立一個 createNode 函式,它接受一個整數引數並返回一個新節點,該節點具有給定的索引以及為空的左子節點和右子節點。
步驟 3 − 建立 isprime() 函式來檢查節點是否為素數。
步驟 4 − 建立一個 printTree 函式,它接受指向二叉樹根節點的指標並列印樹的先序遍歷。
步驟 5 − 建立一個 constructPrimeBinaryTree 函式,它接受三個引數:圖的鄰接表的引用、已訪問陣列的引用以及當前節點的指標。該函式使用鄰接表和已訪問陣列遞迴地構建具有素數的二叉樹。對於當前節點的每個尚未訪問的鄰居,如果其索引加上當前節點的索引是素數,則建立一個具有鄰居索引的新節點,如果當前節點的左子節點為空,則將其新增為左子節點,否則將其新增為右子節點。然後在新的節點上遞迴呼叫 constructPrimeBinaryTree()。
步驟 6 − 在 main 中:
將變數 n 初始化為 6,它是樹中節點的數量。
將變數 adjList 初始化為一個向量,該向量表示圖的鄰接表。
將鄰居新增到 adjList 的每個元素中。
將變數 visited 初始化為一個向量,該向量表示節點是否已被訪問。
將 visited[0] 設定為 true,因為節點 0 是根節點。
建立一個變數 root,它是一個指向使用 createNode(0) 函式建立的根節點的指標。
呼叫 constructPrimeBinaryTree(adjList, visited, root) 函式,使用鄰接表和已訪問陣列構建具有素數的二叉樹。
呼叫 printTree(root) 函式,以先序遍歷方式列印樹。
示例
#include <iostream> #include <vector> #include <queue> using namespace std; class Node { public: int index; Node* leftChild; Node* rightChild; Node(int idx) : index(idx), leftChild(nullptr), rightChild(nullptr) {} }; Node* createNode(int idx) { return new Node(idx); } bool isPrime(int n) { if (n <= 1) return false; for (int i = 2; i * i <= n; i++) if (n % i == 0) return false; return true; } void printTree(Node* root) { if (root == nullptr) return; cout << root->index << " "; printTree(root->leftChild); printTree(root->rightChild); } void constructPrimeBinaryTree(vector<vector<int>>& adjList, vector<bool>& visited, Node* curr) { for (int neighbor : adjList[curr->index]) { if (!visited[neighbor] && isPrime(curr->index + neighbor)) { visited[neighbor] = true; Node* newNode = createNode(neighbor); if (curr->leftChild == nullptr) curr->leftChild = newNode; else curr->rightChild = newNode; constructPrimeBinaryTree(adjList, visited, newNode); } } } int main() { int n = 6; vector<vector<int>> adjList(n); adjList[0].push_back(1); adjList[0].push_back(2); adjList[1].push_back(3); adjList[1].push_back(4); adjList[2].push_back(5); vector<bool> visited(n, false); visited[0] = true; Node* root = createNode(0); constructPrimeBinaryTree(adjList, visited, root); printTree(root); return 0; }
輸出
0 2 5
結論
本文探討了如何使用 C++ 程式碼從給定的 N 個節點的非迴圈圖構建素數二叉樹。透過遵循上述逐步方法,程式設計師可以有效地在各種應用中實現這種資料結構。程式碼使用遞迴函式返回素數二叉樹。