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

C++のバイナリツリーでリーフ以外のノードをカウントする


二分木が与えられ、タスクは二分木で利用可能な非リーフノードの数を計算することです。

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

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

C++のバイナリツリーでリーフ以外のノードをカウントする

入力

C++のバイナリツリーでリーフ以外のノードをカウントする

出力 −非リーフノードの数は次のとおりです:3

説明 −与えられたツリーでは、子が0を超え、子が2未満であるため、非リーフノードとして27、14、および35があります。

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

  • 左ノードへのポインタ、右ノードへのポインタ、およびノー​​ドに格納されているデータ部分を含むバイナリツリーの構造を作成します

  • この関数が呼び出されるたびにノードを挿入する関数を作成します。そのためには、新しいノードにデータを挿入し、新しいノードの左右のポインタをNULLに設定して、ノードを返します。

  • 二分木の非葉ノードの数を数える再帰関数を作成します。

    • ルートがNULLであるか、ルートの左側がNULLで、ルートの右側がNULLであるかを確認し、0を返します
    • Return1+左ポインタを使用したこの関数への再帰呼び出し+右ポインタを使用したこの関数への再帰呼び出し
  • カウントを印刷する

#include <iostream>
using namespace std;
// Node's structure
struct Node {
   int data;
   struct Node* left;
   struct Node* right;
};
// To define the new node
struct Node* newNode(int data){
   struct Node* node = new Node;
   node->data = data;
   node->left = node->right = NULL;
   return (node);
}
// Count the non leaf nodes.
int nonleaf(struct Node* root){
   if (root == NULL || (root->left == NULL && root->right == NULL)){
      return 0;
   }
   return 1 + nonleaf(root->left) + nonleaf(root->right);
}
// Main function
int main(){
   struct Node* root = newNode(10);
   root->left = newNode(21);
   root->right = newNode(33);
   root->left->left = newNode(48);
   root->left->right = newNode(51);
   cout << nonleaf(root);
   return 0;
}

出力

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

count of non-leaf nodes is: 2

  1. バイナリツリーのすべてのリーフノードをC++で右から左に印刷します

    この問題では、二分木が与えられ、二分木のすべてのリーフノードを右から左に印刷する必要があります。 問題を理解するために例を見てみましょう 入力 − 出力 − 7 4 1 この問題を解決するには、二分木をトラバースする必要があります。このトラバーサルは2つの方法で実行できます- プレオーダートラバーサル −このトラバーサルは再帰を使用します。ここでは、トラバース、ルート、左、右のサブツリーを作成します。リーフノードに遭遇した場合はそれを印刷します。それ以外の場合は、ノードの子をチェックし、それらを探索してリーフノードを見つけます。 例 ソリューションの実装を示すプログラム-

  2. C ++の1つのスタックを使用して、リーフノードを左から右にバイナリツリーで印刷します。

    プログラムは、バイナリツリーのリーフノードを左から右に出力する必要がありますが、課題は1つのスタックのみを使用することです push()関数を使用してバイナリツリーのノードを挿入し、pop()操作を使用してリーフノードを表示します。 リーフノードは、左右のポインタがNULLであるエンドノードです。これは、特定のノードが親ノードではないことを意味します。 例 Input : 12 21 32 41 59 33 70 Output : 41 59 33 70 スタックはLIFO構造であるデータ構造であり、トップポインターが最後に挿入された要素を指すため、リーフノードは最後にスタックに挿