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

C ++のバイナリツリー(反復および再帰)のハーフノードをカウントします


バイナリツリーが与えられ、タスクは、反復的かつ再帰的なアプローチを使用して、バイナリツリーで使用可能なハーフノードの数を計算することです。ハーフノードは、子が1つだけで、もう1つの子がnullであるノードです。ハーフノードでは、リーフノードを考慮しないことに注意してください。

バイナリツリーは、データストレージの目的で使用される特別なデータ構造です。二分木には、各ノードが最大2つの子を持つことができるという特別な条件があります。バイナリツリーには、検索が並べ替えられた配列と同じくらい高速であり、挿入または削除操作がリンクリストと同じくらい高速であるため、順序付き配列とリンクリストの両方の利点があります。非リーフノードは、子が0を超え、子が2つ未満であるため、親ノードとも呼ばれます。

二分木の構造を以下に示します-

C ++のバイナリツリー(反復および再帰)のハーフノードをカウントします

入力

C ++のバイナリツリー(反復および再帰)のハーフノードをカウントします

出力 −カウントは2です

説明 −指定されたツリーには2つのノードがあります。つまり、40と50に1つの子があるか、半分のノードがあります。他のノードには2つの子があるか、子がない場合があります。

反復

以下のプログラムで使用されているアプローチは次のとおりです

  • データ部分、左ポインタ、右ポインタを含むノードの構造を作成します。

  • 二分木にノードを挿入する関数を作成します。

  • ハーフノードをカウントする関数を作成します。

  • 関数内で、IF!nodeをチェックしてから、ツリーにノードがないために戻ります。

  • 一時変数カウントを宣言して、ハーフノードのカウントを保存します

  • キュータイプ変数を作成します。たとえば、qu

  • キュー内のノードをqu.push(node)

    としてプッシュします
  • !qu.empty()

    の間にループします
  • 一時変数を作成します。たとえば、ノードタイプの一時変数を作成し、queue.front()

    で初期化します。
  • qu.pop()

    を使用して要素をポップします
  • IF(!temp-> leftAND temp-> right)OR(temp-> left AND!temp-> right)をチェックしてから、カウントを1ずつ増やします

  • IF(temp-> left!=NULL)を確認してから、qu.push(temp-> left)

    を実行します。
  • カウントを返す

  • 結果を印刷します。

// Program to count half nodes in a Binary Tree
#include <iostream>
#include <queue>
using namespace std;
struct Node{
   int data;
   struct Node* left, *right;
};
// Function to get the count of half Nodes
int halfcount(struct Node* node){
   // If tree is empty
   if (!node)
   return 0;
   int result = 0; // Initialize count of half nodes
   // Do level order traversal starting from root
   queue<Node *> myqueue;
   myqueue.push(node);
   while (!myqueue.empty()){
      struct Node *temp = myqueue.front();
      myqueue.pop();
      if ((!temp->left && temp->right) || (temp->left && !temp->right)){
         result++;
      }
      if (temp->left != NULL){
         myqueue.push(temp->left);
      }
      if (temp->right != NULL){
         myqueue.push(temp->right);
      }
   }
   return result;
}
/* To allocate new Node with the given data and NULL left
and right pointers. */
struct Node* newNode(int data){
   struct Node* node = new Node;
   node->data = data;
   node->left = node->right = NULL;
   return (node);
}
int main(void){
   struct Node *root = newNode(10);
   root->left = newNode(20);
   root->right = newNode(30);
   root->left->left = newNode(40);
   root->left->right = newNode(50);
   root->left->left->right = newNode(60);
   root->left->right->right = newNode(70);
   cout <<"count is: "<<halfcount(root);
   return 0;
}

出力

上記のコードを実行すると、次の出力が得られます-

count is: 2

再帰的

以下のプログラムで使用されているアプローチは次のとおりです

  • データ部分、左ポインタ、右ポインタを含むノードの構造を作成します。

  • 二分木にノードを挿入する関数を作成します。

  • ハーフノードをカウントする関数を作成します。

  • 関数内で、IF!nodeをチェックしてから、ツリーにノードがないために戻ります。

  • 一時変数カウントを宣言して、ハーフノードのカウントを保存します

  • IF(root-> left =NULL AND root-> right!=NULL)OR(root-> left!=NULL AND root-> right ==NULL)をチェックしてから、カウントを1増やします

  • set count =count + recursive_call_to_this_function(root-> left)+ recursive_call_to_this_function(root-> right)

  • カウントを返す

  • 結果を印刷します。

// Recursive program to count half nodes
#include <bits/stdc++.h>
using namespace std;
// A binary tree Node has data, pointer to left
// child and a pointer to right child
struct Node{
   int data;
   struct Node* left, *right;
};
int halfcount(struct Node* root){
   if (root == NULL)
   return 0;
   int result = 0;
   if ((root->left == NULL && root->right != NULL) || (root->left != NULL && root->right ==
   NULL)){
      result++;
   }
   result += (halfcount(root->left) + halfcount(root->right));
   return result;
}
/* to allocate a new Node with the given data and NULL left
and right pointers. */
struct Node* newNode(int data){
   struct Node* node = new Node;
   node->data = data;
   node->left = node->right = NULL;
   return (node);
}
int main(){
   struct Node *root = newNode(10);
   root->left = newNode(20);
   root->right = newNode(30);
   root->left->left = newNode(40);
   root->left->right = newNode(50);
   root->left->left->right = newNode(60);
   root->left->right->right = newNode(70);
   cout <<"count is: "<<halfcount(root);
   return 0;
}

出力

上記のコードを実行すると、次の出力が得られます-

count is: 2

  1. バイナリツリーのすべての内部ノードをC++で出力します

    この問題では、二分木が与えられ、二分木のすべての内部ノードを印刷する必要があります。 二分木 は、ノードが最大2つの子ノードを持つことができるツリーです。ノードまたは頂点にノードを含めることはできません。1つの子ノードまたは2つの子ノードを使用できます。 例 − 内部ノード は、少なくとも1つの子を持つことができるノードです。つまり、非リーフノードは内部ノードです。 問題を理解するために例を見てみましょう- 出力 − 7 4 9 この問題を解決するために、BFS(幅優先探索)トラバーサルを使用してバイナリツリーをトラバースします。 トラバーサル中に、ノードをキューに

  2. 与えられた二分木のポストオーダー再帰トラバーサルを実行するC++プログラム

    ツリートラバーサルは、グラフトラバーサルの一種です。これには、ツリー内の各ノードを1回だけチェックまたは印刷することが含まれます。二分探索木のポストオーダートラバーサルでは、ツリー内の各ノードに順番に(左、右、ルート)アクセスします。 二分木のポストオーダートラバーサルの例は次のとおりです。 二分木は次のように与えられます。 注文後のトラバーサルは次のとおりです:1 5 4 8 6 注文後の再帰的走査を実行するプログラムは次のとおりです。 例 #include<iostream> using namespace std; struct node {   &