C++で二分木における最も深い奇数レベルノードの深さを求める方法
このチュートリアルでは、C++を使って二分木(バイナリツリー)の中から最も深い奇数レベルにあるノードの深さを求める方法を学びます。
これは二分木の深さを求める処理とよく似ています。ただし、今回は「現在のレベルが奇数であるかどうか」という条件が1つ追加される点が異なります。
それでは、問題を解くための手順を順番に見ていきましょう。
ダミーデータを使って二分木を初期化します。
二分木の中で最も深い奇数レベルのノードを見つけるための再帰関数を作成します。
現在のノードが葉ノードであり、かつそのレベルが奇数の場合は、現在のレベルを返します。
それ以外の場合は、左の子ノードと右の子ノードに対して再帰的に関数を呼び出し、その結果の最大値を返します。
最も深い奇数レベルのノードの深さを出力します。
コード例
それでは、実際のコードを見てみましょう。
#include <bits/stdc++.h>
using namespace std;
struct Node {
int data;
struct Node *left, *right;
};
struct Node* newNode(int data) {
struct Node* node = (struct Node*) malloc(sizeof(struct Node));
node->data = data;
node->left = node->right = NULL;
return node;
}
int oddLeafDepthInTree(struct Node *root, int level) {
if (root == NULL) {
return 0;
}
if (root->left == NULL && root->right == NULL && level % 2 == 1) {
return level;
}
return max(oddLeafDepthInTree(root->left, level + 1), oddLeafDepthInTree(root->right, level + 1));
}
int main() {
struct Node* root = newNode(1);
root->left = newNode(2);
root->right = newNode(3);
root->left->left = newNode(4);
root->right->left = newNode(5);
root->right->right = newNode(6);
root->right->left->right = newNode(7);
root->right->right->right = newNode(8);
int level = 1, depth = 0;
cout << oddLeafDepthInTree(root, level) << endl;
return 0;
}実行結果
上記のコードを実行すると、以下のような結果が出力されます。
3
まとめ
このチュートリアルでは、再帰関数を活用して二分木の中で最も深い奇数レベルにあるノードの深さを求める方法を解説しました。ポイントは、葉ノードに到達した時点でレベルの偶奇を判定し、奇数であればそのレベルを候補として返すことです。本チュートリアルについてご質問がある場合は、ぜひコメント欄でお知らせください。
-
C++で二分木における最も近い葉ノードまでの距離を求める方法
二分木が与えられ、その葉ノードはそれぞれ異なるレベルに存在するとします。さらに、あるノードを指すポインタが与えられ、そのノードから最も近い葉ノードまでの距離を求める必要があります。例として、次のような二分木を考えてみましょう。この木における葉ノードは 2、-2、6 の3つです。もしポインタがノード -5 を指している場合、-5 から最も近い葉ノードまでの距離は 1 となります。解決のアプローチこの問題を解くには、次の手順で考えます。まず、指定されたノードを根とする部分木を走査し、その部分木内で最も近い葉ノードを見つけて距離を記録します。次に、木の根から全体を走査します。ノード x が左部分木に
-
C++で二分木の奇数レベルにあるノードを出力するプログラム
このチュートリアルでは、与えられた二分木(バイナリツリー)の中から、奇数レベルに存在するノードを出力するC++プログラムについて解説します。 本プログラムでは、ルートノードのレベルを「1」と定義し、それ以降のレベルは交互にカウントしていきます。つまり、レベル1・3・5…といった奇数番目の階層に属するノードが出力の対象となります。 例として、以下のような二分木が与えられた場合を考えてみましょう。 この二分木の場合、奇数レベルに存在するノードは 1, 4, 5, 6 となります。 アルゴリズムの考え方 実装には再帰呼び出しを利用します。ルートから探索を開始し、現在のレベルが奇数かどうかをブール