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

C++の二分木で最も深い左葉ノード


このチュートリアルでは、二分木で最も深い左葉ノードを見つけます。二分木を見てみましょう。

   A
      B    C
D       E       F
                     G

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

  • char、left、rightポインタを使用してNode構造体を記述します。

  • ダミーデータで二分木を初期化します。

  • 再帰関数を記述して、バイナリ関数の左端のノードを見つけます。最も深いノードを格納するには、3つの引数のルートノード、isLeftNode、および結果ポインタが必要です。

  • 現在のノードが残っていてリーフノードである場合は、結果ノードを現在のノードで更新します。

  • 左側のサブツリーで再帰関数を呼び出します。

  • 右側のサブツリーで再帰関数を呼び出します。

  • 結果ノードがnullの場合、条件を満たすノードはありません。

  • それ以外の場合は、結果ノードにデータを出力します。

コードを見てみましょう。

#include <bits/stdc++.h>
using namespace std;
struct Node {
   char data;
   struct Node *left, *right;
};
Node *addNewNode(char data) {
   Node *newNode = new Node;
   newNode->data = data;
   newNode->left = newNode->right = NULL;
   return newNode;
}
void getDeepestLeftLeafNode(Node *root, bool isLeftNode, Node **resultPointer) {
   if (root == NULL) {
      return;
   }
   if (isLeftNode && !root->left && !root->right) {
      *resultPointer = root;
      return;
   }
   getDeepestLeftLeafNode(root->left, true, resultPointer);
   getDeepestLeftLeafNode(root->right, false, resultPointer);
}
int main() {
   Node* root = addNewNode('A');
   root->left = addNewNode('B');
   root->right = addNewNode('C');
   root->left->left = addNewNode('D');
   root->right->left = addNewNode('E');
   root->right->right = addNewNode('F');
   root->right->left->right = addNewNode('G');
   Node *result = NULL;
   getDeepestLeftLeafNode(root, false, &result);
   if (result) {
      cout << "The deepest left child is " << result->data << endl;
   }
   else {
      cout << "There is no left leaf in the given tree" << endl;
   }
   return 0;
}

出力

上記のプログラムを実行すると、次の結果が得られます。

The deepest left child is D

結論

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


  1. バイナリツリーのすべてのリーフノードをC++で右から左に印刷します

    この問題では、二分木が与えられ、二分木のすべてのリーフノードを右から左に印刷する必要があります。 問題を理解するために例を見てみましょう 入力 − 出力 − 7 4 1 この問題を解決するには、二分木をトラバースする必要があります。このトラバーサルは2つの方法で実行できます- プレオーダートラバーサル −このトラバーサルは再帰を使用します。ここでは、トラバース、ルート、左、右のサブツリーを作成します。リーフノードに遭遇した場合はそれを印刷します。それ以外の場合は、ノードの子をチェックし、それらを探索してリーフノードを見つけます。 例 ソリューションの実装を示すプログラム-

  2. C++の二分木で最も近い葉を見つけます

    1つの二分木が与えられたとします。さまざまなレベルのリーフノードがあります。ノードを指す別のポインターが与えられます。尖ったノードから最も近いリーフノードまでの距離を見つける必要があります。ツリーが以下のようであると考えてください- ここで、リーフノードは2、-2、および6です。ポインタがノード-5を指している場合、-5から最も近いノードは距離1になります。 これを解決するために、指定されたノードをルートとするサブツリーをトラバースし、サブツリー内で最も近いリーフを見つけて、距離を保存します。ここで、ルートからツリーをトラバースします。ノードxが左側のサブツリーに存在する場合は、右側