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

C++での偶数の祖父母を持つノードの合計


二分木があるとすると、偶数の祖父母を持つノードの値の合計を見つける必要があります。 (ノードの祖父母は、存在する場合はその親の親です。)偶数の祖父母を持つそのようなノードがない場合は、0を返します。したがって、ツリーが-

のような場合

C++での偶数の祖父母を持つノードの合計

出力は18になります。赤いノードは偶数の祖父母を持つノードであり、青いノードは偶数の祖父母です。

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

  • 親と呼ばれるマップを定義する
  • solve()と呼ばれるメソッドを定義します。これはノードとパーを取ります
  • ノードがnullの場合は、戻ります
  • parがnullでなく、parが親に存在し、parent [par]が0でなく、parent [par]の値が偶数の場合、
    • res:=res+ノードの値
  • 親[ノード]:=パー
  • solve(ノードの左側、ノード)
  • solve(ノードの権利、ノード)
  • メインメソッドから、res:=0を設定し、solve(root、Null)を呼び出してから、resを返します

例(C ++)

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

#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 res;
   map <TreeNode*, TreeNode*> parent;
   void solve(TreeNode* node, TreeNode* par = NULL){
      if(!node)return;
      if(par && parent.count(par) && parent[par] && parent[par]->val % 2 == 0){
         res += node->val;
      }
      parent[node] = par;
      solve(node->left, node);
      solve(node->right, node);
   }
   int sumEvenGrandparent(TreeNode* root) {
      res = 0;
      parent.clear();
      solve(root);
      return res;
   }
};
main(){
   vector<int> v = {6,7,8,2,7,1,3,9,NULL,1,4,NULL,NULL,NULL,5};
   TreeNode *root = make_tree(v);
   Solution ob;
   cout << (ob.sumEvenGrandparent(root));
}

入力

[6,7,8,2,7,1,3,9,null,1,4,null,null,null,5]

出力

18

  1. C++で最も深い葉の合計

    二分木があるとすると、その最も深い葉の値の合計を見つける必要があります。したがって、ツリーが次のような場合- その場合、出力は15になります。 これを解決するには、次の手順に従います- マップmとmaxDepthを定義します 再帰メソッドsolve()を定義します。これはノードとレベルを取ります。最初はレベルは0です ノードが存在しない場合は、戻ります maxDepth:=レベルとmaxDepthの最大値 ノードの値でm[level]を増やします solve(ノードの左側、レベル+ 1) solve(ノードの権利、レベル+ 1) メインメソッドで、maxDepth:=0を設定して

  2. C++での二分探索木から大和木へ

    異なる値を持つ二分探索木のルートがあるとすると、すべてのノードがノードの値以上の元のツリーの値の合計に等しい新しい値を持つように変更する必要があります。二分探索木を扱っていることを覚えておく必要があります。これにより、BSTのプロパティが維持されます。したがって、入力ツリーが次のような場合- その場合、出力ツリーは-になります。 これを解決するには、次の手順に従います- グローバルに設定:=0 rootを入力として受け取る再帰関数solve()を定義します。 ルートの権利がnullでない場合は、solve(ルートの権利) グローバル:=グロ