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

C++でUnivalueサブツリーをカウントする


二分木があるとしましょう。単一値のサブツリーの数を数える必要があります。ここで、単一値サブツリーは、サブツリーのすべてのノードが同じ値を持っていることを示しています。

したがって、入力がroot =[5,1,5,5,5、null、5]、

のような場合

C++でUnivalueサブツリーをカウントする

その場合、出力は4になります

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

  • 関数solve()を定義します。これはノードを取ります

  • ノードが空の場合、-

    • trueを返す

  • 左:=solve(ノードの左側)

  • 右:=ソルブ(ノードの右)

  • 左が偽または右が偽の場合、-

    • falseを返す

  • ノードの左側が存在し、ノードの値がノードの左側の値と等しくない場合、-

    • falseを返す

  • ノードの権利が存在し、ノードの値がノードの権利の値と等しくない場合、-

    • falseを返す

  • (retを1増やします)

  • trueを返す

  • メインの方法から、次のようにします-

  • ret:=0

  • 解決(ルート)

  • retを返す

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

#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 ret;
   bool solve(TreeNode* node){
      if (!node || node->val == 0)
         return true;
      bool left = solve(node->left);
      bool right = solve(node->right);
      if (!left || !right)
         return false;
      if (node->left && node->left->val != 0 && node->val != node->left->val)
         return false;
      if (node->right && node->right->val != 0 && node->val != node->right->val)
         return false;
      ret++;
      return true;
   }
   int countUnivalSubtrees(TreeNode* root){
      ret = 0;
      solve(root);
      return ret;
   }
};
main(){
   Solution ob;
   vector<int< v = {5,1,5,5,5,NULL,5};
   TreeNode *root = make_tree(v);
   cout << (ob.countUnivalSubtrees(root));
}

入力

{5,1,5,5,5,NULL,5}

出力

4

  1. C++で重複するサブツリーを検索する

    二分木があるとします。重複するすべてのサブツリーを見つける必要があります。したがって、重複するサブツリーの種類ごとに、それらのいずれかのルートノードを返す必要があります。したがって、-のようなツリーがあるとします。 重複するサブツリーは-です これを解決するには、次の手順に従います- 配列retを作成し、マップを作成しますm 再帰メソッドsolve()を定義します。これはノードを入力として受け取ります。これは次のように機能します- ノードがnullの場合、-1を返します x:=ノードの値を文字列として、「#」を連結します。 左:=ソルブ(ノードの左)、右:=ソルブ(ノード

  2. C++で単一値のサブツリーの数を検索する

    二分木があるとします。私たちのタスクは、指定されたツリー内の単一値のサブツリーをカウントすることです。単一値のサブツリーはサブツリーであり、そのツリーのすべてのノードに同じ値が含まれています。木が以下のようなものだとしましょう- 4つの単一値サブツリーがあります。これらは以下のようなものです- これはボトムアップ方式で解決できます。訪問したすべてのサブツリーについて、その下にルートされたサブツリーが単一値の場合はtrueを返し、カウンターを1増やします。ここで、countは再帰呼び出しの参照パラメーターです。そして、戻り値を使用して、左右のサブツリーが単一値であるかどうかを確認