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

C++で二分木の奇数レベルにあるノードを出力するプログラム


このチュートリアルでは、与えられた二分木(バイナリツリー)の中から、奇数レベルに存在するノードを出力するC++プログラムについて解説します。

本プログラムでは、ルートノードのレベルを「1」と定義し、それ以降のレベルは交互にカウントしていきます。つまり、レベル1・3・5…といった奇数番目の階層に属するノードが出力の対象となります。

例として、以下のような二分木が与えられた場合を考えてみましょう。

C++で二分木の奇数レベルにあるノードを出力するプログラム

この二分木の場合、奇数レベルに存在するノードは 1, 4, 5, 6 となります。

アルゴリズムの考え方

実装には再帰呼び出しを利用します。ルートから探索を開始し、現在のレベルが奇数かどうかをブール値(真偽値)のフラグで管理します。子ノードへ移動するたびにフラグを反転させることで、各ノードが奇数レベルに属しているかどうかを簡単に判定できます。フラグが「true」のときだけ、そのノードの値を出力します。

サンプルコード

#include <bits/stdc++.h>
using namespace std;
struct Node {
   int data;
   Node* left, *right;
};
// 奇数レベルのノードを出力する
void print_onodes(Node *root, bool is_odd = true){
   if (root == NULL)
      return;
   if (is_odd)
      cout << root->data << " " ;
   print_onodes(root->left, !is_odd);
   print_onodes(root->right, !is_odd);
}
// 新しいノードを作成する
struct Node* create_node(int data){
   struct Node* node = new Node;
   node->data = data;
   node->left = node->right = NULL;
   return (node);
}
int main(){
   struct Node* root = create_node(13);
   root->left = create_node(21);
   root->right = create_node(43);
   root->left->left = create_node(64);
   root->left->right = create_node(85);
   print_onodes(root);
   return 0;
}

出力

13 64 85

上記のコードでは、ルート(13)がレベル1、その子ノード(21, 43)がレベル2、さらにその下のノード(64, 85)がレベル3に位置します。したがって、奇数レベルであるレベル1とレベル3のノード「13 64 85」が出力されます。


  1. C++で二分木のノードを葉ノードになった順に出力する方法

    問題概要 二分木が与えられたとき、まずその葉ノード(リーフノード)を出力します。次に、出力した葉ノードを木から取り除き、新たに葉ノードとなったノードを出力します。この操作を、木の中にノードが一つも残らなくなるまで繰り返します。 例 以下のような二分木を例に考えてみましょう。 まず最下層の葉ノード「6 7 9 13 14」を出力して取り除き、次に新たな葉ノードとなった「3 4」を出力、続いて「2」、最後に根ノード「1」を出力します。したがって、この問題の出力は以下のようになります。 6 7 9 13 14 3 4 2 1 アプローチ この問題では、DFS(深さ優先探索)を用いたアプロ

  2. C++で二分木の奇数レベルにあるノードを出力する方法

    はじめに二分木が与えられたとき、プログラムは木の奇数レベルにあるノードを出力する必要があります。ここでいうレベルとは、二分木の階層を表し、ルートをレベル1として1からnまで数えます。実装方法については特に指定がないため、再帰または反復のどちらかのアプローチを選択できます。本記事では、コードが簡潔になる再帰的なアプローチを採用します。プログラムは関数を再帰的に呼び出し、その関数が奇数レベルのノードを取得して出力します。上記の二分木の場合 −レベル1のノード: 10 レベル2のノード: 3 と 211 レベル3のノード: 140、162、100、146この木では、レベル1とレベル3が奇数レベルに該