C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

ルートとリーフパスのペアがあり、合計がC++のルートのデータと等しいかどうかを確認します


この問題では、二分木が与えられます。そして、合計がルートのデータに等しいリーフパスへのルートにペアがあるかどうかを見つける必要があります。

ペアの値の合計がルートノードの値と等しくなるように、ルートノードとリーフノードの間にノードのペアが存在するかどうかを確認する必要があります。

問題を理解するために例を見てみましょう。

入力:

ルートとリーフパスのペアがあり、合計がC++のルートのデータと等しいかどうかを確認します

出力: はい

説明:

ルートノード値7

合計値がルートノード(2、5)、(1、6)に等しいペア。

ソリューションアプローチ:

ツリーをトラバースし、ハッシュを使用してペアを見つける必要があります。

このために、hashTableとトラバースツリーを作成します。データをハッシュテーブルに挿入し、他の要素との合計がルートと等しいかどうかを確認します。

最後に、ペアが見つからない場合は、falseを返します。

ペアが見つかった場合は、trueを返します。

ソリューションの動作を説明するプログラム

#include<bits/stdc++.h>
using namespace std;

struct Node {
   
   int data;
   struct Node* left, *right;
};

struct Node* newnode(int data) {
   
   struct Node* node = new Node;
   node->data = data;
   node->left = node->right = NULL;
   return (node);
}

bool findSumUntill(Node *node, unordered_set<int> &amp;hashTable, int rootVal)
{
   if (node == NULL)
      return false;

   int otherVal = rootVal - node->data;
   if (hashTable.find(otherVal) != hashTable.end())
      return true;

   hashTable.insert(node->data);
   bool isFound = findSumUntill(node->left, hashTable, rootVal) || findSumUntill(node->right, hashTable, rootVal);
   hashTable.erase(node->data);

   return isFound;
}

bool findPairSum(Node *root) {
   
   unordered_set<int> hashTable;

   return findSumUntill(root->left, hashTable, root->data) || findSumUntill(root->right, hashTable, root->data);
}

int main()
{
   struct Node *root = newnode(7);
   root->left = newnode(2);
   root->right = newnode(3);
   root->left->left = newnode(5);
   root->left->right = newnode(9);
   root->left->left->left = newnode(1);
   root->left->left->right = newnode(6);
   root->right->left = newnode(8);
   
   if(findPairSum(root))
      cout<<"Pair with sum equal to root value found";
   else
      cout<<"No pairs found";
   return 0;
}

出力

Pair with sum equal to root value found

  1. C++でのパス合計III

    各ノードが整数キーを保持する二分木を与えたと仮定します。合計して特定の値になるパスを見つける必要があります。パスはルートからリーフまで開始する必要があります。合計が同じになるパスを見つける必要があります。 ツリーが[5,4,8,11、null、13,4,7,2、null、null、5,1]のようで、合計が22の場合、-になります。 パスは[[5,4,11,2]、[5,8,4,5]]です。 これを解決するには、次の手順に従います- この問題を解決するには、dfs関数を使用します。dfsはわずかに変更されています。これは次のように機能します。この関数は、ルート、合計、および1つの一時

  2. C++で相対位置があるすべてのルートからリーフへのパスを出力します

    この問題では、二分木が与えられます。そして、ルートからツリーの葉までのすべてのパスを印刷する必要があります。 また、ノードの相対位置を示すためにアンダースコア「_」を追加します。 トピックをよりよく理解するために例を見てみましょう- 入力- 出力- _ _ 3 _ 9 1 _3 9 _7 3 _ 4 _ _ 2 3 9 4 1 7 6 2 3 _ 4 6 この問題を解決するために、ツリーの要素の垂直方向の順序の概念を使用します。 これに基づいて、ルートからリーフへのパスを出力します。 アルゴリズム Step 1: Traverse the binary tree us