C ++のバイナリツリー(反復および再帰)のハーフノードをカウントします
バイナリツリーが与えられ、タスクは、反復的かつ再帰的なアプローチを使用して、バイナリツリーで使用可能なハーフノードの数を計算することです。ハーフノードは、子が1つだけで、もう1つの子がnullであるノードです。ハーフノードでは、リーフノードを考慮しないことに注意してください。
バイナリツリーは、データストレージの目的で使用される特別なデータ構造です。二分木には、各ノードが最大2つの子を持つことができるという特別な条件があります。バイナリツリーには、検索が並べ替えられた配列と同じくらい高速であり、挿入または削除操作がリンクリストと同じくらい高速であるため、順序付き配列とリンクリストの両方の利点があります。非リーフノードは、子が0を超え、子が2つ未満であるため、親ノードとも呼ばれます。
二分木の構造を以下に示します-
例
入力 −
出力 −カウントは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
-
バイナリツリーのすべての内部ノードをC++で出力します
この問題では、二分木が与えられ、二分木のすべての内部ノードを印刷する必要があります。 二分木 は、ノードが最大2つの子ノードを持つことができるツリーです。ノードまたは頂点にノードを含めることはできません。1つの子ノードまたは2つの子ノードを使用できます。 例 − 内部ノード は、少なくとも1つの子を持つことができるノードです。つまり、非リーフノードは内部ノードです。 問題を理解するために例を見てみましょう- 出力 − 7 4 9 この問題を解決するために、BFS(幅優先探索)トラバーサルを使用してバイナリツリーをトラバースします。 トラバーサル中に、ノードをキューに
-
与えられた二分木のポストオーダー再帰トラバーサルを実行するC++プログラム
ツリートラバーサルは、グラフトラバーサルの一種です。これには、ツリー内の各ノードを1回だけチェックまたは印刷することが含まれます。二分探索木のポストオーダートラバーサルでは、ツリー内の各ノードに順番に(左、右、ルート)アクセスします。 二分木のポストオーダートラバーサルの例は次のとおりです。 二分木は次のように与えられます。 注文後のトラバーサルは次のとおりです:1 5 4 8 6 注文後の再帰的走査を実行するプログラムは次のとおりです。 例 #include<iostream> using namespace std; struct node { &