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

C++のn-aryツリーの偶数サイズのサブツリー


この問題では、n-aryツリーを示す隣接リストが与えられます。私たちのタスクは、n-aryツリー内の偶数サイズのサブツリーの数を見つけることです。

N-aryツリー は、通常、次のように階層的に表されるノードのコレクションとして定義されます。

ツリーはルートノードで開始されます。

ツリーの各ノードは、その子ノードへのポインタのリストを維持します。

子ノードの数がm以下です。

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

入力:

C++のn-aryツリーの偶数サイズのサブツリー

出力: 4

説明:

7をルートとするツリーのサイズは同じです。
2をルートとするツリーのサイズは同じです。
0をルートとするツリーは、サイズが均等です。
3をルートとするツリーのサイズは同じです。

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

単純なアプローチは、evenTreeCountを増やしても、特定のノードのすべての子ノードをカウントすることです。このために、DFSを使用して、指定されたノードのサブツリーの長さを見つけます。

これは、ツリー上の単一のトラバーサルを使用して実行できます。 各子ノードのサブツリーのサイズを再帰的に見つけてサイズを確認し、偶数の場合はevenTreeCountを増やし、それ以外の場合はそのままにします。

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

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

int countEventSizeSubTree(vector<int> adj[], int n, int v, int&amp; EvenCount){

   int size = 1;
   for (auto ele : adj[v]) {
      size += countEventSizeSubTree(adj, n, ele, EvenCount);
   }
   if (size % 2 == 0)
      EvenCount++;
   return size;
}

int main(){

   int n;
   n = 10;

   vector<int> adj[n + 1];
   adj[7].push_back(2);
   adj[7].push_back(9);
   adj[2].push_back(0);
   adj[2].push_back(1);
   adj[9].push_back(3);
   adj[3].push_back(8);
   adj[0].push_back(5);

   int EvenCount = 0;
   countEventSizeSubTree(adj, n, 1, EvenCount);
   cout<<"Even Size SubTree are "<<EvenCount;
   return 0;
}

出力-

Even Size SubTree are 0

  1. C++での再帰なしのN-aryツリーのプレオーダートラバーサル

    この問題では、N-aryツリーが与えられます。私たちのタスクは、ツリーのプレオーダートラバーサルを印刷することです。 まず、いくつかの基本的な用語を学びましょう。 N-aryツリー は、すべてのノードが最大N個の子ノードを持つことができるツリーです。例2-ary(バイナリ)ツリーには最大2つの子ノードがあります。 プレオーダートラバーサル ツリーのノードをトラバースする方法です。ここでは、最初にルートノードをトラバースし、次に左の子、次に右の子をトラバースします。 私たちの問題を理解するために例を見てみましょう Preorder traversal : 1215149941171

  2. 二分木がC++の別の二分木のサブツリーであるかどうかを確認します

    2つの二分木があるとします。小さい方のツリーが別の二分木のサブツリーであるかどうかを確認する必要があります。これらの2本の木が与えられていると考えてください。 2本の木があります。 2番目のツリーは、最初のツリーのサブツリーです。このプロパティを確認するために、ポストオーダー方式でツリーをトラバースします。このノードをルートとするサブツリーが2番目のツリーと同一である場合、それはサブツリーです。 例 #include <bits/stdc++.h> using namespace std; class node {    public:   &