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

C++のバイナリツリーの最大スパイラル合計


この問題では、二分木が与えられます。私たちのタスクは、C++のバイナリツリーで最大スパイラル合計を見つけるプログラムを作成することです。

スパイラルサム 二分木のスパイラルトラバーサルで遭遇するノードの合計です。

ツリーのスパイラルトラバーサルでは、ノードはルートからリーフノードにトラバースされます。トラバーサルは左から右に行われ、次のレベルでは右から左に、以下同様に次のレベルで行われます。

C++のバイナリツリーの最大スパイラル合計

出力 −5

説明

ツリーの第2レベルの最初のノードまでスパイラルトラバーサルを検討します。

1+ 5 = 5.

3行目の合計要素は(1-9 + 6-4 =-6)であり、全体の合計が減少するため、最大合計を考慮して削除されます。

この問題を解決するために、各レベルの要素の合計を格納する配列を使用し、各レベルのスピラーの合計を見つけるために、2つのスタックを使用します。次に、最後に、レベルの後に合計を含めると最大合計が増えるかどうかを確認します。含まれる場合はそれを取得し、そうでない場合は残りのスパイラルを破棄します。

二分木で最大スパイラル和を見つけるプログラム

#include <bits/stdc++.h>
using namespace std;
struct Node {
   int data;
   Node *left, *right;
};
Node* insertNode(int data){
   Node* node = new Node;
   node->data = data;
   node->left = node->right = NULL;
   return node;
}
int findMaxSum(vector<int> arr, int n){
   int sum = INT_MIN;
   int maxSum = INT_MIN;
   for (int i = 0; i < n; i++) {
      if (sum < 0)
         sum = arr[i];
      else
         sum += arr[i];
      maxSum = max(maxSum, sum);
   }
   return maxSum;
}
int SpiralSum(Node* root){
   if (root == NULL)
      return 0;
   stack<Node*> sRtL;
   stack<Node*> sLtR;
   vector<int> arr;
   sRtL.push(root);
   while (!sRtL.empty() || !sLtR.empty()) {
      while (!sRtL.empty()) {
         Node* temp = sRtL.top();
         sRtL.pop();
         arr.push_back(temp->data);
         if (temp->right)
            sLtR.push(temp->right);
         if (temp->left)
            sLtR.push(temp->left);
      }
      while (!sLtR.empty()) {
         Node* temp = sLtR.top();
         sLtR.pop();
         arr.push_back(temp->data);
         if (temp->left)
            sRtL.push(temp->left);
         if (temp->right)
            sRtL.push(temp->right);
      }
   }
   return findMaxSum(arr, arr.size());
}
int main(){
   Node* root = insertNode(1);
   root->left = insertNode(5);
   root->right = insertNode(-1);
   root->left->left = insertNode(-4);
   root->left->right = insertNode(6);
   root->right->left = insertNode(-9);
   root->right->right = insertNode(1);
   cout << "Maximum Spiral Sum in binary tree : "<<SpiralSum(root);
   return 0;
}

出力

Maximum Spiral Sum in binary tree : 6

  1. C ++での二分木の反時計回りのスパイラルトラバーサル?

    二分木の反時計回りのスパイラルトラバーサルは、トラバースされた場合にスパイラルを作成するが逆の順序でツリーの要素をトラバースします。次の図は、二分木の反時計回りのスパイラルトラバーサルを示しています。 二分木のスパイラルトラバーサル用に定義されたアルゴリズムは、次のように機能します- 2つの変数iとjが初期化され、値はi=0およびj=変数の高さと同等になります。フラグは、セクションが印刷されている間をチェックするために使用されます。フラグは最初はfalseに設定されています。 i

  2. Pythonでの二分木最大パス合計

    空でない二分木が1つあるとします。パスの合計を見つける必要があります。したがって、ここでのパスとは、開始ノードから親子接続が存在するノードまでのノードのシーケンスです。パスには少なくとも1つのノードが含まれている必要があり、ルートノードを通過する必要はありません。したがって、入力ツリーが-の場合 ここで、出力は32になります。 これを解決するには、次の手順に従います- solve()と呼ばれる1つのメソッドを定義します。これはノードを取ります nodeがnullまたはnodeの値が0の場合、0を返します left:=最大0およびsolve(ノードの左側) ri