与えられた二分木が満二分木(Full Binary Tree)かどうかを判定するC++プログラム
二分木が与えられたとき、それが満二分木(Full Binary Tree)であるかどうかを判定するのが本記事のテーマです。すべてのノードが子を0個または2個持つとき、その二分木は満二分木と呼ばれます。
入力例と出力例
入力1:

出力:
1
説明: 葉ノード以外のすべてのノードが2つの子を持っているため、この二分木は満二分木です。
入力2:

出力:
0
説明: ノード2が子を1つしか持っていないため、この二分木は満二分木ではありません。
問題を解くためのアプローチ
与えられた二分木が満二分木かどうかを判定するには、左部分木と右部分木に対して再帰的にチェックを行うのが効果的です。
- ノードとその子から構成される二分木を入力として受け取ります。
- ブール型関数
isFullBinaryTree(Node* root)は根ノードを引数に取り、木が満二分木であればtrueを、そうでなければfalseを返します。 - 基本条件:根ノードが
NULL(空)の場合はtrueを返します。 - 左部分木と右部分木がどちらも
NULLの場合はtrueを返します。 - 左部分木と右部分木それぞれに対して再帰的にチェックを行い、その結果を返します。
実装例
#include<iostream>
using namespace std;
struct treenode {
int data;
treenode *left;
treenode *right;
};
struct treenode *createNode(int d) {
struct treenode *root = new treenode;
root->data = d;
root->left = NULL;
root->right = NULL;
return root;
}
bool isFullBinaryTree(struct treenode *root) {
if (root == NULL) {
return true;
}
if (root->left == NULL && root->right == NULL) {
return true;
} else if (root->left && root->right) {
return (isFullBinaryTree(root->left) && isFullBinaryTree(root->right));
}
return false;
}
int main() {
struct treenode *root = NULL;
root = createNode(1);
root->left = createNode(2);
root->right = createNode(3);
root->left->right = createNode(4);
root->left->left = createNode(5);
root->right->left = createNode(6);
if (isFullBinaryTree(root)) {
cout << "1" << endl;
} else {
cout << "0" << endl;
}
return 0;
}
上記のコードを実行すると、以下の出力が得られます。
出力
0
説明: この二分木では、ノード3が子を1つ(左の子のみ)しか持っていません。満二分木であるためには、すべてのノードが子を0個または2個持つ必要があるため、この木は満二分木とはみなされず、出力は0となります。
なお、このアルゴリズムは各ノードを一度ずつ訪問するため、ノード数を n とすると計算量は O(n) であり、非常に効率的です。
-
Pythonで二分木が二分探索木(BST)かどうかを判定する方法
はじめに:BSTとは何か二分木が与えられたとき、それが二分探索木(Binary Search Tree:BST)であるかどうかを判定することは、データ構造の学習やコーディング面接でよく出題される定番の問題です。BSTには以下のような重要な性質があります。左部分木に含まれるすべてのノードの値は、現在のノードの値より小さい右部分木に含まれるすべてのノードの値は、現在のノードの値より大きいこれらの性質は、木の中のすべてのノードに対して再帰的に成り立つたとえば、次のような二分木を考えてみましょう。ルート:5左の子:1右の子:9(その左の子:7、さらに左の子:6・右の子:8/右の子:10)この場合、すべ
-
Pythonで二分木が完全二分木かどうかを判定するプログラム
完全二分木とは二分木が与えられたとき、その木が完全二分木(complete binary tree)であるかどうかを判定することを考えます。完全二分木とは、最後のレベルを除くすべてのレベルがノードで埋め尽くされており、最後のレベルのノードはすべて可能な限り左側に寄せられている二分木のことです。例えば、次のような二分木が入力として与えられた場合、出力は True になります。アルゴリズム(BFSによる判定方法)この問題は、幅優先探索(BFS)を使って効率的に解けます。木をレベル順に走査し、初めて空のノード(None)が出現した後に再びノードが出現したら、その木は完全二分木ではないと判断できます。