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

C++プログラムで値がxのリーフノードを削除します


このチュートリアルでは、指定された値を持つツリーからリーフノードを削除する方法を学習します。

問題を解決するための手順を見てみましょう。

  • 二分木の構造体ノードを記述します。

  • ツリーをトラバース(順序付け、事前順序付け、事後順序付け)して、すべてのデータを出力する関数を記述します。

  • 構造体を使用してノードを作成し、ツリーを初期化します。

  • x値を初期化します。

  • 指定された値を持つリーフノードを削除する関数を記述します。ルートノードとx値の2つの引数を受け入れます。

    • ルートがnullリターンの場合。

    • 削除後、ルートの左側のノードを新しいルートに置き換えます。

    • ルートの右側のノードと同じです。

    • 現在のルートノードデータがxに等しく、それがリーフノードである場合は、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 x) {
   if (root == NULL) {
      return nullptr;
   }
   root->left = deleteLeafNodes(root->left, x);
   root->right = deleteLeafNodes(root->right, x);
   // checking the current node data with x
   if (root->data == x && 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

結論

チュートリアルに質問がある場合は、コメントセクションにそのことを記載してください。


  1. 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

  2. C++を使用して再帰を使用せずにルートからリーフへのパスを出力するプログラム

    このチュートリアルでは、ルートノードから特定のバイナリツリー内のすべてのリーフノードへのパスを出力するプログラムについて説明します。 たとえば、次の二分木があるとしましょう この二分木には、4つのリーフノードがあります。したがって、ルートノードからリーフノードへのパスは4つになります。 これを解決するために、反復アプローチを使用します。二分木のプレオーダートラバーサルを実行している間、マップに親ポインタを格納できます。トラバーサル中にリーフノードに遭遇したときはいつでも、親ポインタを使用してルートノードからそのパスを簡単に出力できます。 例 #include <bits/st