二分木の走査

二分探索木を生成し、再帰的なC++関数による先行順・中間順・後行順の走査をステップごとに確認します。

すべてこのブラウザ内でシミュレートされ、サーバーには一切送信されません。

ノード、左部分木、右部分木の順に訪問します。

ノード60で関数が呼び出される

ノード60で関数が呼び出される

二分木

60458568215532

出力

まだ訪問したノードがありません

  • 未訪問
  • 実行中
  • スタック上
  • 訪問済み

ステップ 1 / 44

コード

#include <iostream>
using namespace std;
class Node { // ノードは値と2つの子へのポインタを保持します
private: // プライベート属性:メソッドだけが触れます
int value;
Node* left;
Node* right;
public:
Node(int v) : value(v), left(nullptr), right(nullptr) {}
int getValue() const { return value; }
Node* getLeft() const { return left; }
Node* getRight() const { return right; }
void setLeft(Node* n) { left = n; }
void setRight(Node* n) { right = n; }
};
void preorder(Node* node) { // node を根とする部分木を走査します
if (node == nullptr) return; // 基底ケース: 空の部分木には訪問するものがありません
cout << node->getValue() << " "; // ノードを訪問し、その値を処理します
preorder(node->getLeft()); // 左の部分木を走査します
preorder(node->getRight()); // 右の部分木を走査します
} // 呼び出し元に戻ります
Node* insert(Node* root, int v) { // v を探索木に挿入し、根を返します
if (root == nullptr) return new Node(v); // 空きの位置: 新しいノードはここに入ります
if (v < root->getValue()) // 小さい値は左へ、大きい値は右へ進みます
root->setLeft(insert(root->getLeft(), v));
else
root->setRight(insert(root->getRight(), v));
return root;
}
Node* buildTree() { // 値を1つずつ挿入して木を構築します
int values[] = {60, 45, 85, 68, 21, 55, 32}; // 表示中の木の値(挿入順)
Node* root = nullptr;
for (int v : values) root = insert(root, v);
return root;
}
int main() {
Node* root = buildTree(); // アニメーションの木(構築済み)
preorder(root); // main からの最初の呼び出し
cout << endl; // 走査の終了
return 0;
}

このツールは、ランダムな値で二分探索木(BST)を生成し、再帰的なC++関数でステップごとに走査します。前順、中順、後順のいずれかを選ぶと、同じ木の上で各ノードがいつ訪問されるか(子より前、子の間、子より後)が分かります。ノードは状態(未訪問、実行中、スタック上など)で色分けされ、訪問した値が出力欄に並びます。対応するC++コードの行も強調されます。データ構造の授業や復習に便利で、処理はブラウザー内で行われます。

使い方

  1. 走査の種類を、前順、中順、後順から選びます。
  2. スライダーで木のサイズを調整するか、「新しい木を生成」を押します。アニメーションは最初のステップに戻ります。
  3. 「再生」を押すか、前へ・次へのボタンで進め、必要なら速度を変更します。
  4. 色付きのノード、訪問した値を並べた出力欄、強調されるC++コードの行を確認します。

よくある質問

二分木と二分探索木とは何ですか?
二分木は、各ノードが左右最大2つの子を持つ構造です。二分探索木(BST)ではさらに、左の部分木の値がノードより小さく、右の部分木の値が大きくなります。
前順、中順、後順の違いは何ですか?
子に対してノードをいつ訪問するかが違います。前順はノード、左、右の順、中順は左、ノード、右の順、後順は左、右、ノードの順です。前順は木のコピー、中順はBSTの昇順読み出し、後順は木の解放や評価に使われます。子が親より先に処理されるためです。
BSTの中順走査で値が昇順に並ぶのはなぜですか?
BSTでは、ノードの左側がすべて小さく、右側がすべて大きいためです。左の部分木、ノード、右の部分木の順に訪問すると、小さい順に値が得られます。
C++で再帰的な走査はどう実装しますか?
ノードへのポインターを受け取る関数を使います。ポインターがnullptrなら何もせず戻ります。これがベースケースです。そうでなければ、走査の種類に応じた順序で、ノードを訪問し、左の子と右の子に対して自身を呼び出します。

関連ツール