C++のバイナリツリーでリーフ以外のノードをカウントする
二分木が与えられ、タスクは二分木で利用可能な非リーフノードの数を計算することです。
バイナリツリーは、データストレージの目的で使用される特別なデータ構造です。二分木には、各ノードが最大2つの子を持つことができるという特別な条件があります。バイナリツリーには、検索が並べ替えられた配列と同じくらい高速であり、挿入または削除操作がリンクリストと同じくらい高速であるため、順序付き配列とリンクリストの両方の利点があります。非リーフノードは、子が0を超え、子が2つ未満であるため、親ノードとも呼ばれます。
二分木の構造を以下に示します-
例
入力 −
出力 −非リーフノードの数は次のとおりです: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
-
バイナリツリーのすべてのリーフノードをC++で右から左に印刷します
この問題では、二分木が与えられ、二分木のすべてのリーフノードを右から左に印刷する必要があります。 問題を理解するために例を見てみましょう 入力 − 出力 − 7 4 1 この問題を解決するには、二分木をトラバースする必要があります。このトラバーサルは2つの方法で実行できます- プレオーダートラバーサル −このトラバーサルは再帰を使用します。ここでは、トラバース、ルート、左、右のサブツリーを作成します。リーフノードに遭遇した場合はそれを印刷します。それ以外の場合は、ノードの子をチェックし、それらを探索してリーフノードを見つけます。 例 ソリューションの実装を示すプログラム-
-
C ++の1つのスタックを使用して、リーフノードを左から右にバイナリツリーで印刷します。
プログラムは、バイナリツリーのリーフノードを左から右に出力する必要がありますが、課題は1つのスタックのみを使用することです push()関数を使用してバイナリツリーのノードを挿入し、pop()操作を使用してリーフノードを表示します。 リーフノードは、左右のポインタがNULLであるエンドノードです。これは、特定のノードが親ノードではないことを意味します。 例 Input : 12 21 32 41 59 33 70 Output : 41 59 33 70 スタックはLIFO構造であるデータ構造であり、トップポインターが最後に挿入された要素を指すため、リーフノードは最後にスタックに挿