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