Javaバイナリツリーの実装と具体的な応用事例を詳しく解説
Java バイナリ ツリーの実装と具体的なアプリケーション ケースの詳細な説明
バイナリ ツリーはコンピュータ サイエンスでよく使用されるデータ構造で、非常に効率的な検索と並べ替え操作を実行できます。この記事では、Java でバイナリ ツリーを実装する方法と、その具体的なアプリケーション ケースについて説明します。
バイナリ ツリーの定義
バイナリ ツリーは非常に重要なデータ構造であり、ルート ノード (ツリーの最上位ノード) といくつかの左側のサブツリーと右側のサブツリーで構成されます。各ノードには最大 2 つの子ノードがあり、左側の子ノードは左サブツリーと呼ばれ、右側の子ノードは右サブツリーと呼ばれます。ノードに子ノードがない場合、そのノードはリーフ ノードまたはターミナル ノードと呼ばれます。
Java でのバイナリ ツリーの実装
Java で Node クラスを使用してバイナリ ツリー ノードを表すことができます。このクラスには、int 型の値と、左右の 2 つの Node 型参照が含まれています。それぞれ左側が子ノード、右側が子ノードです。以下はサンプル コードです。
class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } }
バイナリ ツリーの基本操作を実装する
- バイナリ ツリーを作成する
バイナリ ツリーを作成できます。再帰的に、最初にルート ノードを作成し、次に左のサブツリーと右のサブツリーをそれぞれ作成します。以下にサンプルコードを示します:
public class TreeBuilder { public TreeNode buildTree(int[] array) { if (array == null || array.length == 0) { return null; } return build(array, 0, array.length - 1); } private TreeNode build(int[] array, int start, int end) { if (start > end) { return null; } int mid = (start + end) / 2; TreeNode root = new TreeNode(array[mid]); root.left = build(array, start, mid - 1); root.right = build(array, mid + 1, end); return root; } }
- Find Node
バイナリツリーの検索操作は非常に効率的で、一般的には左側の子を検索するかどうかで決まります。ノード値とターゲット値のサイズを比較することで、ツリーは依然として正しいサブツリーになります。以下はサンプルコードです:
public class TreeSearch { public TreeNode search(TreeNode root, int target) { if (root == null || root.val == target) { return root; } if (root.val > target) { return search(root.left, target); } else { return search(root.right, target); } } }
- ノードの挿入
バイナリツリーに新しいノードを挿入するときは、ノードの値とサイズを比較する必要があります。挿入された値を比較し、比較結果に基づいて、新しいノードを左側のサブツリーに挿入するか、右側のサブツリーに挿入するかを決定します。以下はサンプル コードです。
public class TreeInsert { public TreeNode insert(TreeNode root, int target) { if (root == null) { return new TreeNode(target); } if (root.val > target) { root.left = insert(root.left, target); } else if (root.val < target) { root.right = insert(root.right, target); } return root; } }
- ノードの削除
ノードの削除は比較的複雑な操作であり、いくつかの状況に応じて説明する必要があります。ノード A を削除するとします。これは次の 3 つの状況に分類できます。
- A はリーフ ノードであり、直接削除できます。
- A には子ノードが 1 つだけあります。子ノードをその位置に置き換えるだけです。
- A には 2 つの子ノードがあります。右側のサブツリーで最小のノード B を見つけ、A を B の値に置き換えて、B を削除する必要があります。
以下はサンプル コードです:
public class TreeDelete { public TreeNode delete(TreeNode root, int target) { if (root == null) { return null; } if (root.val > target) { root.left = delete(root.left, target); } else if (root.val < target) { root.right = delete(root.right, target); } else { if (root.left == null && root.right == null) { return null; } else if (root.left == null) { return root.right; } else if (root.right == null) { return root.left; } else { TreeNode min = findMin(root.right); root.val = min.val; root.right = delete(root.right, min.val); } } return root; } private TreeNode findMin(TreeNode node) { while (node.left != null) { node = node.left; } return node; } }
特定のアプリケーション ケース
バイナリ ツリーは、k 番目の要素の検索、検索など、いくつかの一般的なデータ構造の問題を解決できます。最小の k 要素、二分木の深さの検索など。
以下は具体的なアプリケーション ケースです:
- k 番目の要素を見つける
バイナリ ツリーを順番に走査した結果は次のとおりです。順序なので、インオーダートラバーサルを使用して k 番目の要素を見つけることができます。以下はサンプル コードです。
public class TreeFindKth { private int cnt = 0; public int kthSmallest(TreeNode root, int k) { if (root == null) { return Integer.MAX_VALUE; } int left = kthSmallest(root.left, k); if (left != Integer.MAX_VALUE) { return left; } cnt++; if (cnt == k) { return root.val; } return kthSmallest(root.right, k); } }
- 最小の k 要素を見つける
バイナリ ツリー内の最小の k 要素を見つけるには、順序トラバーサルを使用することもできます。 、上位 k 個の要素を取得します。以下はサンプル コードです。
public class TreeFindMinK { public List<Integer> kSmallest(TreeNode root, int k) { List<Integer> result = new ArrayList<>(); Stack<TreeNode> stack = new Stack<>(); TreeNode current = root; while (current != null || !stack.isEmpty()) { while (current != null) { stack.push(current); current = current.left; } current = stack.pop(); result.add(current.val); if (result.size() == k) { return result; } current = current.right; } return result; } }
- バイナリ ツリーの深さの確認
再帰を使用してバイナリ ツリーの深さを確認できます。以下はサンプル コードです。
public class TreeDepth { public int maxDepth(TreeNode root) { if (root == null) { return 0; } return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1; } }
概要
この記事では、Java でのバイナリ ツリーの実装と、いくつかの具体的なアプリケーション ケースを紹介します。バイナリ ツリーは、大量のデータを処理するときによく使用される非常に効率的なデータ構造です。実際のアプリケーションでは、より良いパフォーマンスを得るために、特定の問題の特性に応じてさまざまな実装方法を選択できます。
以上がJavaバイナリツリーの実装と具体的な応用事例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4
