コンピュータ プログラミングを行う場合、特定のノードから D 単位以上離れたノードをサブツリーに含めることができないという条件で、特定のノードから生じるサブツリーの最小重みを見つける必要がある場合があります。指定されたノード。この問題は、グラフ理論、ツリーベースのアルゴリズム、ネットワーク最適化など、さまざまな分野やアプリケーションで発生します。
サブツリーは、指定されたノードがサブツリーのルート ノードとして機能する、より大きなツリー構造のサブセットです。サブツリーには、ルート ノードのすべての子孫とそれらの接続エッジが含まれます。ノードの重みは、そのノードに割り当てられた特定の値を指し、その重要性、重要性、またはその他の関連するメトリックを表すことができます。この問題の目標は、ルート ノードから最大 D 単位離れたノードにサブツリーを制限しながら、サブツリー内のすべてのノード間の最小重みを見つけることです。
次の記事では、境界がノード X から D ノードの距離以下にあるサブツリーから最小重みをマイニングする複雑さについて詳しく説明します。
###方法###- 深さ優先検索 (DFS) この問題を解決する最も一般的で簡単な方法の 1 つは、サブツリーの深さ優先検索 (DFS) トラバーサルを使用することです。
-この問題を解決する別の方法は、幅優先検索 (BFS) を使用してサブツリーを走査することです。
###文法###Node* x は、ツリーのルート ノードへのポインタを表します。
###アルゴリズム###
- 深さ優先の方法でサブツリーを走査し、ルート ノードから各ノードの距離を注意深く記録します。
ステップ 3 - これまでに発生した最小の重みを追跡するために変数を維持します。
ステップ 4 - 各ノードで、ルート ノードからそのノードまでの距離が D 制限内であるかどうかを評価します。その場合、現在のノードの重みを使用して最小重み変数を更新します。
ステップ 5 - サブツリー内のすべてのノードに対してステップ 3 と 4 を繰り返します。
ステップ 6 - 最後に、サブツリーから取得した最小重みを返します。
方法1 この課題に対する最も単純かつ一般的な解決策の 1 つは、サブツリーの深さ優先検索 (DFS) 探索を利用することです。このアプローチでは、深さ優先の方法で特定のノードのサブツリーをトラバースし、次の兄弟に進む前に各ノードとその子孫を訪問します。各ノードで、ルート ノードからの距離を評価し、指定された制限内にある場合は、これまでに見つかった最小の重みを変更します。このアプローチの実行時間の複雑さは O(n) です。各ノードは 1 回だけ訪問されるため、n はサブツリー内のノードの数を表します。
###例###提供されたコードは、バイナリ ツリー内のノード "X" から最大 "d" 距離離れたサブツリー内のノードの最小重みを決定するように設計されたプログラムを構成します。バイナリ ツリーは、「ノード」と呼ばれる構造によって表されます。この構造には、重み、左の子ノードへの参照、および右の子ノードへの参照が含まれます。 メイン関数「findMinimumWeightDFS」は、ノード「x」と整数「d」を入力として受け取り、「x」から最大「d」距離離れたノードの最小重みを返します。この関数は、バイナリ ツリーに対して深さ優先検索 (DFS) を実行し、これまでに見つかった最小重みを更新するヘルパー関数「findMinimumWeightDFS」を使用します。
方法 2
该代码构成了一个程序,旨在确定二叉树中节点的最小权重,给定距根节点的最大距离“d”。该策略涉及对二叉树进行广度优先搜索 (BFS) 探索,并将每个节点及其与根节点的距离存储在队列中。该函数以根节点及其距离为 0 启动,并将其添加到队列中。
然后,它迭代地从队列的前面检索节点,如果节点的距离至多为“d”,则更新最小权重。如果该节点拥有左或右后代,它会将孩子添加到具有更新距离的队列中。该函数将继续执行,直到队列为空。最后,函数返回BFS探索得到的最小权重。
#include <iostream> #include <queue> #include <climits> using namespace std; // Definition of Node structure struct Node { int weight; Node* left; Node* right; Node(int w) : weight(w), left(nullptr), right(nullptr) {} }; // Function to perform BFS traversal and find minimum weight int findMinimumWeightBFS(Node* x, int d) { queue<pair<Node*, int>>q; // Create a queue to store nodes and their distances q.push({x, 0}); // Push the root node and its distance (0) to the queue int minWeight = INT_MAX; // Initialize minWeight to a large value while (!q.empty()) { Node* curr = q.front().first; // Get the current node from the front of the queue int distance = q.front().second; // Get the distance of the current node from the root q.pop(); // Pop the current node from the queue // If the current node is at most D-distant from the root node, update minWeight if (distance <= d) { minWeight = min(minWeight, curr->weight); } // If the current node has left child, push it to the queue with updated distance if (curr->left) { q.push({curr->left, distance + 1}); } // If the current node has right child, push it to the queue with updated distance if (curr->right) { q.push({curr->right, distance + 1}); } } return minWeight; // Return the minimum weight obtained } // Driver code int main() { // Create a sample binary tree Node* root = new Node(1); root->left = new Node(2); root->right = new Node(3); root->left->left = new Node(4); root->left->right = new Node(5); root->right->left = new Node(6); root->right->right = new Node(7); // Test the findMinimumWeightBFS function int d = 2; int minWeight = findMinimumWeightBFS(root, d); cout << "Minimum weight from subtree of at most " << d << "-distant nodes from node X: " << minWeight << endl; return 0; }
Minimum weight from subtree of at most 2-distant nodes from node X: 1
本文介绍了如何使用 C++ 从二叉树中与特定节点 X 相距最多 D 距离的节点子树中获取最小权重。我们研究了深度优先搜索 (DFS) 和广度优先搜索 (BFS) 方法,并提供了每种方法的实现代码和示例结果。
以上がノード X から始まるサブツリーの最小重みと最大 D の距離を照会します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。