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

C++で2次元でバイナリツリーを印刷する


この問題では、二分木が与えられ、それを2次元平面で印刷する必要があります。

二分木は、すべてのノードに最大2つの子ノードがある特別なツリーです。したがって、すべてのノードはリーフノードであるか、1つまたは2つの子ノードを持っています。

C++で2次元でバイナリツリーを印刷する

トピックをよりよく理解するために例を見てみましょう-

C++で2次元でバイナリツリーを印刷する

出力-

      7
   4
5
      1
   3
      8

例で見たように、ツリーのノードは2D出力画面に水平に印刷されます。

ここでは、ツリーを90°反転しました。

新しい水平ツリーが何で構成されているか見てみましょう。

  • ツリーデータ構造は、以下を含む水平方向に保存されます

    • 開始線からn行下の水平方向のビューの1番目の位置にあるルート。つまり、ルートはn行目の先頭になります。

    • ツリーの新しいレベルは、行n+iとn-iにあります。そして、iで、行の先頭から離れた場所にタブスペースを配置します。

    • そして、ツリーの右端のリーフノードが最初の行に出力されます。一方、ツリーの左端のノードは最後の行に印刷されます。

このロジックに基づいてプログラムを作成しましょう-

#include<bits/stdc++.h>
#include<iostream>
using namespace std;
#define COUNT 10
class Node{
   public:
      int data;
      Node* left, *right;
      Node(int data){
         this->data = data;
         this->left = NULL;
         this->right = NULL;
      }
};
void printTree(Node *root, int space){
   if (root == NULL)
      return;
   space += COUNT;
   printTree(root->right, space);
   for (int i = COUNT; i < space; i++)
      cout<<"\t";
   cout<<root->data<<"\n";
   printTree(root->left, space);
}
int main(){
   Node *root = new Node(43);
   root->left = new Node(25);
   root->right = new Node(67);
   root->left->left = new Node(14);
   root->left->right = new Node(51);
   root->right->left = new Node(26);
   root->right->right = new Node(97);
   root->left->left->left = new Node(81);
   root->left->left->right = new Node(49);
   root->left->right->left = new Node(07);
   root->left->right->right = new Node(31);
   root->right->left->left = new Node(29);
   root->right->left->right = new Node(13);
   root->right->right->left = new Node(59);
   root->right->right->right = new Node(16);
   printTree(root, 0);
   return 0;
}

出力

         16
      97
         59
   67
         13
      26
         29
43
         31
      51
         7
   25
         49
   14
         81

  1. バイナリツリーのすべての内部ノードをC++で出力します

    この問題では、二分木が与えられ、二分木のすべての内部ノードを印刷する必要があります。 二分木 は、ノードが最大2つの子ノードを持つことができるツリーです。ノードまたは頂点にノードを含めることはできません。1つの子ノードまたは2つの子ノードを使用できます。 例 − 内部ノード は、少なくとも1つの子を持つことができるノードです。つまり、非リーフノードは内部ノードです。 問題を理解するために例を見てみましょう- 出力 − 7 4 9 この問題を解決するために、BFS(幅優先探索)トラバーサルを使用してバイナリツリーをトラバースします。 トラバーサル中に、ノードをキューに

  2. C++のバイナリツリーにすべてのk-sumパスを出力します

    この問題では、二分木と数Kが与えられ、パス内のノードの合計がkに等しいツリー内のすべてのパスを出力する必要があります。 ここで、ツリーのパスは、ツリーの任意のノードから開始し、任意のノードで終了することができます。パスは常にルートノードからリーフノードに向かう必要があります。ツリーのノードの値は、正、負、またはゼロにすることができます。 問題を理解するために例を見てみましょう- K =5 出力 − 1 3 1 3 2 1 4 この問題を解決するために、各ノードをツリーのルートノードとして扱い、値を合計してKに達する一時的なルートから他のノードへのパスを見つけます。 パスの