0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

二分探索木のシンプルな例(C#)

Last updated at Posted at 2024-08-08

二分探索木とは

数字を効率よく探したり、並べ替えたりするための特別な木の形をしたデータの仕組み。
左に小さな数字、右に大きな数字があり、探す時間を短くできる。

3分程度の解説動画
https://www.youtube.com/watch?v=6FETCw6ikgw

コード例

using System;

// ノードクラス:二分探索木の各ノードを表す
public class TreeNode
{
    public int Value; // ノードの値
    public TreeNode Left; // 左の子ノード
    public TreeNode Right; // 右の子ノード

    public TreeNode(int value) // コンストラクタ
    {
        Value = value;
        Left = null;
        Right = null;
    }
}

// 二分探索木クラス
public class BinarySearchTree
{
    public TreeNode Root; // 木のルートノード

    public BinarySearchTree() // コンストラクタ
    {
        Root = null;
    }

    // 値を挿入するメソッド
    public void Insert(int value)
    {
        Root = InsertRecursive(Root, value);
    }

    // 再帰的にノードを挿入するヘルパーメソッド
    private TreeNode InsertRecursive(TreeNode node, int value)
    {
        if (node == null)
        {
            return new TreeNode(value); // 新しいノードを作成
        }

        if (value < node.Value)
        {
            node.Left = InsertRecursive(node.Left, value); // 左の子に挿入
        }
        else if (value > node.Value)
        {
            node.Right = InsertRecursive(node.Right, value); // 右の子に挿入
        }

        return node;
    }

    // 中間順序走査(In-order Traversal)メソッド
    public void InOrderTraversal()
    {
        InOrderTraversalRecursive(Root);
    }

    // 再帰的に中間順序走査を行うヘルパーメソッド
    private void InOrderTraversalRecursive(TreeNode node)
    {
        if (node != null)
        {
            InOrderTraversalRecursive(node.Left); // 左の子を走査
            Console.WriteLine(node.Value); // ノードの値を表示
            InOrderTraversalRecursive(node.Right); // 右の子を走査
        }
    }

    // 値を検索するメソッド
    public bool Search(int value)
    {
        return SearchRecursive(Root, value);
    }

    // 再帰的に値を検索するヘルパーメソッド
    private bool SearchRecursive(TreeNode node, int value)
    {
        if (node == null)
        {
            return false; // ノードが見つからない場合
        }

        if (value == node.Value)
        {
            return true; // ノードが見つかった場合
        }

        if (value < node.Value)
        {
            return SearchRecursive(node.Left, value); // 左の子を検索
        }
        else
        {
            return SearchRecursive(node.Right, value); // 右の子を検索
        }
    }
}

使用例

// プログラムのエントリーポイント
class Program
{
    static void Main(string[] args)
    {
        BinarySearchTree bst = new BinarySearchTree();
        bst.Insert(5);
        bst.Insert(3);
        bst.Insert(7);
        bst.Insert(2);
        bst.Insert(6);
        bst.Insert(8);

        Console.WriteLine("In-order Traversal:");
        bst.InOrderTraversal();

        Console.WriteLine("Search for 2: " + bst.Search(2)); // true
        Console.WriteLine("Search for 9: " + bst.Search(9)); // false
    }
}

挿入した値

5, 3, 7, 2, 6, 8

bst.InOrderTraversal(); による出力

2, 3, 5, 6, 7, 8 //小さい順に並び変えられている

木構造

        5
       /  \
      3     7
     /     / \
    2     6   8

理解のポイント

TreeNodeのフィールドとして自身の型の変数を持っている点。

また、下図のような構造をはじめから頭に置いておくと良さそう。

            null
        /          \
      null          null
     /    \         /   \
    null   null   null   null

BinarySearchTreeで上から順にnullにノードを挿入していくイメージ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?