C++プログラムで値kのリーフノードを削除します
このチュートリアルでは、指定された値を持つツリーからリーフノードを削除する方法を学習します。
問題を解決するための手順を見てみましょう。
-
二分木の構造体ノードを記述します。
-
ツリーをトラバース(順序付け、事前順序付け、事後順序付け)し、すべてのデータを出力する関数を記述します。
-
構造体を使用してノードを作成し、ツリーを初期化します。
-
x値を初期化します。
-
指定された値を持つリーフノードを削除する関数を記述します。ルートノードとk値の2つの引数を受け入れます。
-
ルートがnullリターンの場合。
-
削除後、ルートの左側のノードを新しいルートに置き換えます。
-
ルートの右側のノードと同じです。
-
現在のルートノードデータがkに等しく、それがリーフノードである場合は、nullポインタを返します。
-
ルートノードを返す
-
例
コードを見てみましょう。
#include <bits/stdc++.h> using namespace std; struct Node { int data; struct Node *left, *right; }; struct Node* newNode(int data) { struct Node* newNode = new Node; newNode->data = data; newNode->left = newNode->right = NULL; return newNode; } Node* deleteLeafNodes(Node* root, int k) { if (root == NULL) { return nullptr; } root->left = deleteLeafNodes(root->left, k); root->right = deleteLeafNodes(root->right, k); // checking the current node data with k if (root->data == k && root->left == NULL && root->right == NULL) { // deleting the node return nullptr; } return root; } void inorder(Node* root) { if (root == NULL) { return; } inorder(root->left); cout << root->data << " "; inorder(root->right); } int main(void) { struct Node* root = newNode(1); root->left = newNode(2); root->right = newNode(3); root->left->left = newNode(3); root->left->right = newNode(4); root->right->right = newNode(5); root->right->left = newNode(4); root->right->right->left = newNode(4); root->right->right->right = newNode(4); deleteLeafNodes(root, 4); cout << "Tree: "; inorder(root); cout << endl; return 0; }
出力
上記のコードを実行すると、次の結果が得られます。
Tree: 3 2 1 3 5
結論
チュートリアルに質問がある場合は、コメントセクションにそのことを記載してください。
-
C++で相対位置があるすべてのルートからリーフへのパスを出力します
この問題では、二分木が与えられます。そして、ルートからツリーの葉までのすべてのパスを印刷する必要があります。 また、ノードの相対位置を示すためにアンダースコア「_」を追加します。 トピックをよりよく理解するために例を見てみましょう- 入力- 出力- _ _ 3 _ 9 1 _3 9 _7 3 _ 4 _ _ 2 3 9 4 1 7 6 2 3 _ 4 6 この問題を解決するために、ツリーの要素の垂直方向の順序の概念を使用します。 これに基づいて、ルートからリーフへのパスを出力します。 アルゴリズム Step 1: Traverse the binary tree us
-
C++を使用して再帰を使用せずにルートからリーフへのパスを出力するプログラム
このチュートリアルでは、ルートノードから特定のバイナリツリー内のすべてのリーフノードへのパスを出力するプログラムについて説明します。 たとえば、次の二分木があるとしましょう この二分木には、4つのリーフノードがあります。したがって、ルートノードからリーフノードへのパスは4つになります。 これを解決するために、反復アプローチを使用します。二分木のプレオーダートラバーサルを実行している間、マップに親ポインタを格納できます。トラバーサル中にリーフノードに遭遇したときはいつでも、親ポインタを使用してルートノードからそのパスを簡単に出力できます。 例 #include <bits/st