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

二分木の左側面図をC言語で印刷する


タスクは、指定された二分木の左側のノードを印刷することです。まず、ユーザーはデータを挿入してバイナリツリーを生成し、次にそのように形成されたツリーの左側面図を印刷します。

すべてのノードは最大2つの子を持つことができるため、ここでプログラムはノードに関連付けられた左側のポインターのみをトラバースする必要があります

左ポインタがnullでない場合は、データまたはポインタが関連付けられていることを意味します。そうでない場合は、出力として印刷および表示される左の子になります。

Input : 1 0 3 2 4
Output : 1 0 2

二分木の左側面図をC言語で印刷する

ここで、オレンジ色のノードは二分木の左側面図を表しています。

与えられた図では、データ1のノードはルートノードであるため、左の子に移動するよりも0を出力し、3に移動して左の子である2を出力します。

再帰的アプローチを使用して、ノードのレベルを保存し、他のノードに繰り返しシフトすることができます。

以下のコードは、与えられたアルゴリズムのc実装を示しています

アルゴリズム

START
   Step 1 -> create node variable of type structure
      Declare int data
      Declare pointer of type node using *left, *right
   Step 2 -> create function for inserting node with parameter as new_data
      Declare temp variable of node using malloc
      Set temp->data = new_data
      Set temp->left = temp->right = NULL
      return temp
   Step 3 -> declare function void left_view(struct node* root, int level, int* highest_level)
      IF root = NULL
         Exit
      End
      IF *highest_level < level
         Print root->data
         Set *highest_level = level
      End
      Recursively call left_view(root->left, level + 1, highest_level)
      Recursively call left_view(root->right, level + 1, highest_level)
   Step 4 -> Declare Function void left(struct node* root)
      Set int highest_level = 0
      Call left_view(root, 1, &highest_level)
   Step 5-> In main()
      Call New passing value user want to insert as struct node* root = New(1)
      Call left(root)
STOP

#include <stdio.h>
#include <stdlib.h>
//create a structure of a node
struct node {
   int data;
   struct node *left, *right; //this pointer will point to the nodes attached with a node
};
struct node* New(int new_data) {
   struct node* temp = (struct node*)malloc(sizeof(struct node));
   //allocating memory to a pointer    dynamically
   temp->data = new_data;
   temp->left = temp->right = NULL;
   return temp;
}
void left_view(struct node* root, int level, int* highest_level) {
   if (root == NULL) //if there is no node that means no data
   return;
   // this function will retrun the root node if there is only root node in a tree
   if (*highest_level < level) {
      printf("%d\t", root->data);
      *highest_level = level;
   }
   // Recursive function
   left_view(root->left, level + 1, highest_level);
   left_view(root->right, level + 1, highest_level);
}
void left(struct node* root) {
   int highest_level = 0;
   left_view(root, 1, &highest_level);
}
int main() {
   printf("left view of a binary tree is : ");
   struct node* root = New(1);
   root->left = New(0);
   root->right = New(3);
   root->right->left = New(2);
   root->right->right = New(4);
   left(root);
   return 0;
}

出力

上記のプログラムを実行すると、次の出力が生成されます。

left view of a binary tree is : 1 0 2

  1. バイナリツリーレベルをC++でソートされた順序で出力します

    この問題では、二分木が与えられ、すべてのノードを値の並べ替えられた順序でレベルで出力する必要があります。 概念をよりよく理解するために例を見てみましょう。 入力 − 出力 − 20 6 15 2 17 32 78 この問題を解決するには、ツリーの各レベルのソートされた順序を印刷する必要があります。このために、キューと2つの優先キューを作成する必要があります。 NULLセパレータは、2つのレベルを分離するために使用されます。 例 論理を説明するプログラム- #include <iostream> #include <queue> #include <

  2. Pythonのバイナリツリーの最も低い共通の祖先

    二分木があるとします。与えられた2つのノードの中で最も低い共通の祖先ノードを見つける必要があります。 2つのノードpとqのLCAは、実際には、pとqの両方を子孫として持つツリーの最下位ノードです。したがって、二分木が[3,5,1,6,2,0,8、null、null、7,4]のような場合。ツリーは次のようになります- ここで、5と1のLCAは3です これを解決するには、次の手順に従います- ツリーが空の場合は、nullを返します pとqの両方がrootと同じ場合は、rootを返します left:=pとqを使用したルートの左側のサブツリーのLCA right:=pとqを使用したル