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

C++での二分木の最大幅


二分木があるとすると、与えられた木の最大幅を取得する関数を定義する必要があります。ここで、木の幅はすべてのレベルの中で最大の幅です。二分木は完全な二分木と同じ構造であると考えますが、一部のノードはnullです。 1つのレベルの幅は、実際にはエンドノード間の長さです(レベル内の左端と右端の非ヌルノード。エンドノード間のヌルノードも長さの計算にカウントされます)。したがって、ツリーが次のような場合-

C++での二分木の最大幅


最後のレイヤーのノードは[5,3、null、9]

であるため、最大幅は4です。

これを解決するには、次の手順に従います-

  • ans:=1、サイズ:=0

  • (ノード、値)ペアを格納する両端キューqを定義します。

  • (root、1)をqに挿入します

  • qが空ではない間

    • サイズ:=qのサイズ

    • (ノード、値)ペアcurrを定義する

    • サイズが1の場合、(前の要素のノード、1)をqに入れ、qから要素を削除します

    • サイズが0ではない場合

      • curr:=qのフロント要素、qからフロント要素を削除

      • currノードの左側がnullでない場合、

        • (現在のノードの左側、currの2 *値)を作成し、qに挿入します

      • currノードの権利がnullでない場合、

        • (現在のノードの右側、currの2 *値+1)を作成し、qに挿入します

      • サイズがq>1の場合、

        • ans:=ansの最大値、qの最後の要素の値– q+1の最初の要素の値

      • サイズ:=サイズ– 1

  • ansを返す

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class TreeNode{
   public:
   int val;
   TreeNode *left, *right;
   TreeNode(int data){
      val = data;
      left = NULL;
      right = NULL;
   }
};
void insert(TreeNode **root, int val){
   queue<TreeNode*> q;
   q.push(*root);
   while(q.size()){
      TreeNode *temp = q.front();
      q.pop();
      if(!temp->left){
         if(val != NULL)
            temp->left = new TreeNode(val);
         else
            temp->left = new TreeNode(0);
         return;
      }else{
         q.push(temp->left);
      }
      if(!temp->right){
         if(val != NULL)
            temp->right = new TreeNode(val);
         else
            temp->right = new TreeNode(0);
         return;
      }else{
         q.push(temp->right);
      }
   }
}
TreeNode *make_tree(vector<int> v){
      TreeNode *root = new TreeNode(v[0]);
      for(int i = 1; i<v.size(); i++){
      insert(&root, v[i]);
   }
   return root;
}
class Solution {
   public:
   int widthOfBinaryTree(TreeNode* root) {
      int ans = 0;
      deque < pair <TreeNode*, int> > q;
      q.push_back({root,1});
      ans = 1;
      int size;
      while(!q.empty()){
         size = q.size();
         pair <TreeNode*, int> curr;
         if(size == 1){
            q.push_back({q.front().first, 1});
            q.pop_front();
         }
         while(size--){
            curr = q.front();
            q.pop_front();
            if(curr.first->left){
               q.push_back({curr.first->left, 2 * curr.second});
            }
            if(curr.first->right){
               q.push_back({curr.first->right, 2 * curr.second + 1});
            }
         }
         if(q.size() > 1)
            ans = max(ans, q.back().second - q.front().second + 1);
      }
      return ans;
   }
};
main(){
   vector<int> v = {1,3,2,5,3,NULL,9};
   TreeNode *root = make_tree(v);
   Solution ob;
   cout << (ob.widthOfBinaryTree(root));
}

入力

[1,3,2,5,3,null,9]

出力

4

  1. C++のバイナリツリーで最大レベルの製品を検索します

    1つの二分木が与えられたと仮定します。正と負のノードがあります。各レベルで最大の製品を見つける必要があります。 これがツリーであると考えると、レベル0の積は4、レベル1の積は2 * -5 =-10、レベル2の積は-1 * 3 * -2 * 6=36です。最大1つ。 これを解決するために、ツリーのレベル順トラバーサルを実行します。トラバーサル中に、異なるレベルのノードを個別に実行するプロセスを実行します。次に、最大の製品を入手します。 例 #include<iostream> #include<queue> using namespace std; class

  2. C++の二分木で最大垂直和を見つける

    二分木があるとします。タスクは、垂直順序トラバーサルのすべてのノードの合計の最大値を出力することです。したがって、ツリーが以下のようになっている場合- 垂直方向の走査は-のようなものです 4 2 1 + 5 + 6 = 12 3 + 8 = 11 7 9 ここでの最大値は12です。アプローチは単純です。垂直順序トラバーサルを実行してから、合計を見つけて最大値を確認します。 例 #include<iostream> #include<map> #include<vector> #include<queue> using namespace