ホームページ Java &#&チュートリアル Javaのバイナリツリー構造を詳しく解説

Javaのバイナリツリー構造を詳しく解説

Jun 16, 2023 am 08:58 AM
データ構造 Java言語 二分木

バイナリ ツリーは、コンピュータ サイエンスにおける一般的なデータ構造であり、Java プログラミングでも一般的に使用されるデータ構造です。この記事ではJavaのバイナリツリー構造について詳しく紹介します。

1. 二分木とは何ですか?

コンピュータ サイエンスにおけるバイナリ ツリーは、各ノードが最大 2 つの子ノードを持つツリー構造です。このうち、左側の子ノードは親ノードより小さく、右側の子ノードは親ノードより大きい。 Java プログラミングでは、ソート、検索、およびデータ クエリの効率向上を表すためにバイナリ ツリーが一般的に使用されます。

2. Java でのバイナリ ツリーの実装

Java では、バイナリ ツリーの実装には通常、ノード クラス (Node Class) とバイナリ ツリー クラス (Binary Tree Class) が使用されます。ノード クラスはバイナリ ツリー内の各ノードを表し、データを格納するためのバイトと属性を持つことができます。二分木クラスは二分木のデータ構造全体を表し、ノードの挿入、ノードの削除、トラバースなどの機能を持ちます。以下は、単純な Java バイナリ ツリーの実装です。

public class Node {
    int key;
    String value;
    Node leftChild, rightChild;

    public Node(int key, String value) {
        this.key = key;
        this.value = value;
    }
}

public class BinaryTree {
    Node root;

    public void insert(int key, String value) {
        Node newNode = new Node(key, value);
        if (root == null) {
            root = newNode;
        } else {
            Node current = root;
            while (true) {
                if (key < current.key) {
                    if (current.leftChild == null) {
                        current.leftChild = newNode;
                        return;
                    }
                    current = current.leftChild;
                } else {
                    if (current.rightChild == null) {
                        current.rightChild = newNode;
                        return;
                    }
                    current = current.rightChild;
                }
            }
        }
    }

    public Node find(int key) {
        Node current = root;
        while (current.key != key) {
            if (key < current.key) {
                current = current.leftChild;
            } else {
                current = current.rightChild;
            }
            if (current == null) {
                return null;
            }
        }
        return current;
    }

    public void inOrderTraversal(Node node) {
        if (node != null) {
            inOrderTraversal(node.leftChild);
            System.out.println(node.key + ": " + node.value);
            inOrderTraversal(node.rightChild);
        }
    }

    public void preOrderTraversal(Node node) {
        if (node != null) {
            System.out.println(node.key + ": " + node.value);
            preOrderTraversal(node.leftChild);
            preOrderTraversal(node.rightChild);
        }
    }

    public void postOrderTraversal(Node node) {
        if (node != null) {
            postOrderTraversal(node.leftChild);
            postOrderTraversal(node.rightChild);
            System.out.println(node.key + ": " + node.value);
        }
    }

    public static void main(String[] args) {
        BinaryTree tree = new BinaryTree();

        tree.insert(50, "John");
        tree.insert(25, "Alice");
        tree.insert(75, "Bob");
        tree.insert(15, "Chris");
        tree.insert(33, "Diana");
        tree.insert(60, "Emily");
        tree.insert(90, "Fred");

        Node node = tree.find(33);
        System.out.println("Find key: " + node.key + ", value: " + node.value);

        System.out.println("In-order traversal:");
        tree.inOrderTraversal(tree.root);

        System.out.println("Pre-order traversal:");
        tree.preOrderTraversal(tree.root);

        System.out.println("Post-order traversal:");
        tree.postOrderTraversal(tree.root);
    }
}
ログイン後にコピー

上記のバイナリ ツリー コードには、ノードの挿入、ノードの検索、および 3 つの異なるトラバーサル メソッドという 3 つの主要な機能が含まれています。挿入ノードは while ループを使用してバイナリ ツリーの順序でデータを挿入します。検索ノードは while ループを使用してツリーを走査してターゲット データを検索します。3 つの走査メソッドはすべて再帰的に実装されます。

3. バイナリ ツリー トラバーサル メソッド

上記の Java コードでは、プログラムは 3 つの異なるバイナリ ツリー トラバーサル メソッド (順序トラバーサル、プレオーダー トラバーサル、ポストオーダー トラバーサル) を実装しています。このセクションでは、これら 3 つの走査方法を 1 つずつ紹介します。

  1. 順番トラバーサル

順番トラバーサルでは、ツリー内のノードを小さいノードから大きいノードの順にトラバースします。 Java コードでは、順序トラバーサルの実装は再帰を使用します。各ノードに対して、最初にそれ自体の左ノードを呼び出し、次にノード データを出力し、最後にそれ自体の右ノードを呼び出します。このようにして、ツリー内のすべてのノードを小さいノードから大きいノードまで順番にたどることができます。

  1. プレオーダー トラバーサル

プレオーダー トラバーサルでは、親ノード、左ノード、右ノードの順序でツリー内のノードを走査します。 Java コードでは、事前順序トラバーサルの実装でも再帰が使用されます。つまり、各ノードに対して、最初にノード データを出力し、次にそれ自体の左ノードを呼び出し、最後にそれ自体の右ノードを呼び出します。このようにして、ツリー内のすべてのノードを親ノード、左ノード、右ノードの順序でたどることができます。

  1. 事後走査

事後走査では、ツリー内のノードを左ノード、右ノード、親ノードの順序で走査します。 Java コードでは、ポストオーダー トラバーサルの実装でも再帰が使用されます。各ノードに対して、最初にそのノード自体の左ノードを呼び出し、次に独自の右ノードを呼び出し、最後にノード データを出力します。このようにして、ツリー内のすべてのノードを、左ノード、右ノード、親ノードの順序でたどることができます。

4. 一般的に使用されるバイナリ ツリー アルゴリズム

バイナリ ツリーは柔軟で非常に便利なデータ構造であり、Java プログラミングではバイナリ ツリー アルゴリズムがよく使用されます。一般的に使用されるバイナリ ツリー アルゴリズムは次のとおりです。

  1. Search

検索はバイナリ ツリーの最も基本的な機能の 1 つであり、頻繁に使用される機能でもあります。 Java コードでは、検索の実装は非常に簡単です。ノードごとに、ノード値とターゲット値のサイズを比較することによって、ターゲット値が見つかるまで、またはツリー全体が走査されるまで、レイヤーごとに下方向に検索します。

  1. 挿入

挿入は、バイナリ ツリーに新しいノードを追加する機能です。同時に、挿入された新しいノードもバイナリのソート順に従います。木。 Java コードでは、挿入の実装も比較的単純です。挿入されるノードと現在のノードのサイズを比較し、適切な位置が見つかったら新しいノードを挿入します。

  1. 削除

削除は、バイナリ ツリーからノードを削除する機能です。Java コードでは、削除の実装はより複雑であり、より多くの考慮事項が必要です。削除されたノードに子ノードがない場合は、直接削除します。子ノードが 1 つしかない場合は、その子ノードを削除したノードの位置に移動します。削除されたノードに 2 つの子ノードがある場合は、最小値を見つける必要があります。右側の子ノードの値を取得し、削除されたノードの場所に置き換えます。

5. 概要

この記事では、バイナリ ツリーの定義、ノードとバイナリ ツリー クラスの実装、3 つの異なるトラバーサル メソッド、および一般的な方法を含む、Java のバイナリ ツリー データ構造を詳細に紹介します。バイナリツリーアルゴリズムを使用しました。バイナリ ツリーは広く使用されているデータ構造であり、Java はバイナリ ツリーの実装を支援する多くの関数とクラス ライブラリを提供します。 Java でプログラミングする場合、バイナリ ツリーの使用と実装に習熟すると、プログラムの効率とデータ クエリの精度が向上します。

以上がJavaのバイナリツリー構造を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Java 関数比較を使用して複雑なデータ構造を比較する Java 関数比較を使用して複雑なデータ構造を比較する Apr 19, 2024 pm 10:24 PM

Java で複雑なデータ構造を使用する場合、Comparator を使用して柔軟な比較メカニズムを提供します。具体的な手順には、コンパレータ クラスの定義、比較ロジックを定義するための比較メソッドの書き換えが含まれます。コンパレータインスタンスを作成します。 Collections.sort メソッドを使用して、コレクションとコンパレータのインスタンスを渡します。

Javaのデータ構造とアルゴリズム: 詳細な説明 Javaのデータ構造とアルゴリズム: 詳細な説明 May 08, 2024 pm 10:12 PM

データ構造とアルゴリズムは Java 開発の基礎です。この記事では、Java の主要なデータ構造 (配列、リンク リスト、ツリーなど) とアルゴリズム (並べ替え、検索、グラフ アルゴリズムなど) について詳しく説明します。これらの構造は、スコアを保存するための配列、買い物リストを管理するためのリンク リスト、再帰を実装するためのスタック、スレッドを同期するためのキュー、高速検索と認証のためのツリーとハッシュ テーブルの使用など、実際の例を通じて説明されています。これらの概念を理解すると、効率的で保守しやすい Java コードを作成できるようになります。

Go 言語の参照型についての深い理解 Go 言語の参照型についての深い理解 Feb 21, 2024 pm 11:36 PM

参照型は Go 言語の特別なデータ型であり、その値にはデータそのものが直接格納されるのではなく、格納されたデータのアドレスが格納されます。 Go 言語では、参照型にはスライス、マップ、チャネル、ポインターが含まれます。 Go 言語のメモリ管理とデータ転送方法を理解するには、参照型を深く理解することが重要です。この記事では具体的なコード例を組み合わせて、Go言語における参照型の特徴と使い方を紹介します。 1. スライス スライスは、Go 言語で最も一般的に使用される参照型の 1 つです。

PHP データ構造: AVL ツリーのバランス、効率的で秩序あるデータ構造の維持 PHP データ構造: AVL ツリーのバランス、効率的で秩序あるデータ構造の維持 Jun 03, 2024 am 09:58 AM

AVL ツリーは、高速かつ効率的なデータ操作を保証するバランスのとれた二分探索ツリーです。バランスを達成するために、左回転と右回転の操作を実行し、バランスに反するサブツリーを調整します。 AVL ツリーは高さバランシングを利用して、ツリーの高さがノード数に対して常に小さくなるようにすることで、対数時間計算量 (O(logn)) の検索操作を実現し、大規模なデータ セットでもデータ構造の効率を維持します。

Java コレクション フレームワークの完全分析: データ構造を分析し、効率的なストレージの秘密を明らかにする Java コレクション フレームワークの完全分析: データ構造を分析し、効率的なストレージの秘密を明らかにする Feb 23, 2024 am 10:49 AM

Java コレクション フレームワークの概要 Java コレクション フレームワークは Java プログラミング言語の重要な部分であり、データを保存および管理できる一連のコンテナ クラス ライブラリを提供します。これらのコンテナ クラス ライブラリには、さまざまなシナリオでのデータ ストレージと処理のニーズを満たすために、さまざまなデータ構造があります。コレクション フレームワークの利点は、統一されたインターフェイスが提供され、開発者が異なるコンテナ クラス ライブラリを同じ方法で操作できるため、開発の困難さが軽減されることです。 Java コレクション フレームワークのデータ構造 Java コレクション フレームワークにはさまざまなデータ構造が含まれており、それぞれに独自の特性と適用可能なシナリオがあります。以下に、一般的な Java コレクション フレームワークのデータ構造をいくつか示します。 1. リスト: リストは、要素を繰り返すことができる順序付けされたコレクションです。李

Go 言語のデータ構造の秘密を詳しく学ぶ Go 言語のデータ構造の秘密を詳しく学ぶ Mar 29, 2024 pm 12:42 PM

Go 言語のデータ構造の謎を深く研究するには、具体的なコード例が必要ですが、簡潔で効率的なプログラミング言語である Go 言語は、データ構造の処理においても独特の魅力を発揮します。データ構造はコンピューター サイエンスの基本概念であり、より効率的にアクセスして操作できるようにデータを整理および管理することを目的としています。 Go 言語のデータ構造の謎を深く学ぶことで、データがどのように保存され操作されるかをより深く理解できるようになり、それによってプログラミングの効率とコードの品質が向上します。 1. 配列 配列は最も単純なデータ構造の 1 つです

PHP SPL データ構造: プロジェクトにスピードと柔軟性をもたらします PHP SPL データ構造: プロジェクトにスピードと柔軟性をもたらします Feb 19, 2024 pm 11:00 PM

PHPSPL データ構造ライブラリの概要 PHPSPL (標準 PHP ライブラリ) データ構造ライブラリには、さまざまなデータ構造を保存および操作するためのクラスとインターフェイスのセットが含まれています。これらのデータ構造には、配列、リンク リスト、スタック、キュー、セットが含まれており、それぞれがデータを操作するためのメソッドとプロパティの特定のセットを提供します。配列 PHP では、配列は一連の要素を格納する順序付けされたコレクションです。 SPL 配列クラスは、ソート、フィルタリング、マッピングなどのネイティブ PHP 配列の拡張機能を提供します。 SPL 配列クラスの使用例を次に示します。 useSplArrayObject;$array=newArrayObject(["foo","bar","baz"]);$array

Java Map の公開: 高速データ アクセスのためのヒントと戦略 Java Map の公開: 高速データ アクセスのためのヒントと戦略 Feb 19, 2024 pm 06:21 PM

JavaMap は、開発者がデータを迅速に保存および取得できるようにするキーと値のペアベースのデータ構造です。 Map のキーには任意のオブジェクトを指定でき、値には任意のタイプのデータを指定できます。マップ内の各キーには最大 1 つの値しか関連付けることができません。同じキーに複数の値が設定されている場合は、最後に設定された値のみが保持されます。 Map には主に 2 つの実装があります。 HashMap: ハッシュ テーブルを使用してキーと値のペアを格納します。 HashMap のパフォーマンスはハッシュ テーブルの実装方法に依存し、ほとんどの場合、HashMap の方が TreeMap よりも優れたパフォーマンスを発揮します。 TreeMap: 赤黒ツリーを使用してキーと値のペアを保存します。 TreeMap のパフォーマンスは HashMap と似ていますが、場合によっては TreeMap のパフォーマンスが劣る場合があります。

See all articles