Cバイナリ検索ツリーの例
バイナリ検索ツリー(BST)は、左サブツリーにはノードの値よりも低い値を持つノードのみが含まれるバイナリツリーであり、右サブツリーにはノードの値よりも大きい値を持つノードのみが含まれ、両方のサブツリーもBSTでなければなりません。 1. C実装には、値、左、および右のポインターを持つTreeNode構造が含まれます。 2。BSTクラスは、再帰ヘルパー法を使用して、挿入、検索、および順序トラバーサル操作を提供します。 3.挿入値を比較し、重複を回避することにより、BSTプロパティを維持します。 4.比較に基づいて左または右をナビゲートすることにより、検索はO(log n)平均時間で動作します。 5.左、ルート、右にアクセスして、並べ替えられた順序で値を印刷する順序で印刷する。 6.生産に関する重要な考慮事項には、メモリクリーンアップのためのデストラクタの追加、AVLまたは赤黒のロジックを使用してツリーのバランスをとること、スタックオーバーフローを防ぐための反復方法の実装、この例はcのBSTの基礎的理解になります。
以下は、基本的な操作を備えたバイナリ検索ツリー(BST)の実用的な例です。挿入、検索、および順序トラバーサルです。

binaryバイナリ検索ツリーとは何ですか?
BSTは次のバイナリツリーです:
- ノードの左サブツリーには、ノードの値よりも小さい値を持つノードのみが含まれています。
- 右のサブツリーには、ノードの値よりも大きい値を持つノードのみが含まれています。
- 左右のサブツリーもバイナリ検索ツリーでなければなりません。
? C実装の例
#include <iostream> 名前空間STDを使用。 //ツリーノードの構造を定義します streenode { int値; treeNode*左; treenode*右; //コンストラクター treenode(int val):value(val)、left(nullptr)、右(nullptr){} }; //バイナリ検索ツリークラス クラスBST { 公共: treenode* root; //コンストラクター bst():root(nullptr){} //パブリックインサート機能 void insert(int value){ root = insertrecursive(root、value); } //パブリック検索機能 bool search(int value){ return searchRecursive(root、value); } //注文のトラバーサル(ソート順序で値を印刷) void inorder(){ inorderRecursive(root); cout << endl; } プライベート: //ヘルパー:ノードを再帰的に挿入します treenode* insertrecursive(treeNode* node、int value){ //ツリーが空の場合は、新しいノードを作成します if(node == nullptr){ 新しいtreeNode(value)を返します。 } //それ以外の場合、ツリーを再発します if(value <node-> value){ node-> left = insertrecursive(node-> left、value); } else if(value> node-> value){ node-> right = insertrecursive(node-> right、value); } //複製を無視する(value == node-> value) ノードを返す; } //ヘルパー:再帰的に検索します bool searchRecursive(treenode* node、int value){ if(node == nullptr){ falseを返します。 // 見つかりません } if(node-> value == value){ trueを返します。 // 見つかった } if(value <node-> value){ SearchRecursive(node-> left、value)を返します。 } それ以外 { return searchRecursive(node-> right、value); } } //ヘルパー:注文のトラバーサル(左 - > root->右) void inorderRecursive(treenode* node){ if(node!= nullptr){ inorderRecursive(node-> left); cout << node-> value << ""; inorderRecursive(node-> right); } } }; //使用の例 int main(){ BSTツリー; //値を挿入します tree.insert(50); tree.insert(30); tree.insert(70); tree.insert(20); tree.insert(40); tree.insert(60); tree.insert(80); //注文のトラバーサルを印刷(ソートする必要があります) cout << "順序トラバーサル:"; tree.inorder(); //出力:20 30 40 50 60 70 80 //値を検索します cout << "検索40:" <<(tree.search(40)? "fund": "not in not in")<< endl; cout << "検索25:" <<(tree.search(25)? "fund": "not ingoind")<< endl; 0を返します。 }
?出力:
順序トラバーサル:20 30 40 50 60 70 80 検索40:見つかりました 検索25:見つかりません
✅キーポイント:
- 挿入は、値を比較することによりBSTプロパティを維持します。
- 検索は、左/右に進むことにより、効率的です(平均してo(log n))。
- 順序トラバーサルは、ソートされた出力を提供します。これは、BSTの重要な利点の1つです。
- このバージョンは、重複した値を無視します。それを変更して、複製を許可することができます(例:
またはcountを使用することで)。
⚠️注:
これは基本的な実装です。生産の使用については、次のことを検討してください。

- メモリクリーンアップ(ノードを削除するためにデストラクタを追加)。
- バランス(歪んだ木を避けるためにAVLまたは赤黒の木を使用してください)。
- 深い木のスタックオーバーフローを避けるための反復バージョン。
基本的に、この例は、cでBSTがどのように機能するかを理解するための強固な基盤を提供します。
以上がCバイナリ検索ツリーの例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

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

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

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

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

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

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

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

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

Cのベクトル要素を見つける最も一般的な方法は、STD :: findを使用することです。 1。STD:: ITERATORの範囲とターゲット値で検索するために検索します。返されたイテレーターがend()に等しいかどうかを比較することにより、それが見つかったかどうかを判断できます。 2。カスタムタイプまたは複雑な条件の場合、std :: find_ifを使用する必要があり、述語関数またはlambda式を渡す必要があります。 3.文字列などの標準タイプを検索すると、ターゲット文字列を直接渡すことができます。 4.各検索の複雑さはO(n)であり、小規模データに適しています。頻繁に検索するには、std :: setまたはstd :: unordered_setの使用を検討する必要があります。この方法は、シンプルで効果的で、さまざまな検索シナリオに広く適用されます。

答えは次のとおりです。STD:: STRINGコンストラクターを使用して、CHARアレイをSTD :: Stringに変換します。配列に中間体「\ 0」が含まれている場合、長さを指定する必要があります。 1。「\ 0」で終わるcスタイルの文字列の場合、std :: stringsstr(chararray)を使用します。コンバージョンを完了するには。 2.文字配列に中央の「\ 0」が含まれているが、最初のn文字を変換する必要がある場合は、std :: stringstr(chararray、length)を使用します。長さを明確に指定します。 3.固定サイズの配列を処理するときは、「\ 0」で終了してから変換してください。 4。Str.Assign(Chararray、Chararray strlを使用します

ディレクトリ簡潔な(証明)簡潔(証明)は何ですか?どのベンチャーキャピタルが簡潔(証明)をサポートしていますか? SP1ZKVMとProver Network Opsuccccinctテクノロジークロスチェーン検証を証明するトークン経済学トークンの詳細トークンアラケーション潜在的トークンホルダーは、トークンの価格予測を証明するトークンの価格予測を証明するトークンの価格の予測を証明するトークンの潜在的なトークンの予測されるトークンの価格の予測を証明します。サクサク

STD :: Mutexは、データ競争を防ぐために共有リソースを保護するために使用されます。この例では、STD :: lock_guardの自動ロックとロック解除を使用して、マルチスレッドの安全性を確保します。 1。STD:: MUTEXおよびSTD :: LOCK_GUARDを使用すると、ロックの手動管理によってもたらされる異常なリスクを回避できます。 2。マルチスレッドを変更する際には、カウンターなどの共有変数をMutexで保護する必要があります。 3.例外の安全性を確保するために、RAIIスタイルのロック管理をお勧めします。 4.固定順序でデッドロックと複数のロックを避けます。 5.共有リソースへのマルチスレッドアクセスのシナリオは、Mutex同期を使用する必要があり、最終プログラムは予想される10000および実際の出力を正しく出力します:10000。

要素を削除するときに反復している場合は、故障したイテレーターの使用を避ける必要があります。正しい方法は、it = vec.erase(it)を使用し、earseによって返された有効なイテレーターを使用してトラバースを続けることです。 batchバッチ削除に推奨される「消去除去」イディオム:vec.erase(std :: remove_if(vec.begin()、vec.end()、条件)、vec.end())、安全で効率的です。 reverse逆イテレータを使用して背面から前面に削除できますが、ロジックは明確ですが、条件方向に注意を払う必要があります。結論:消去リターン値でイテレーターを常に更新し、障害のあるイテレーターの操作を禁止します。そうしないと、未定義の動作が生じます。

todebugac applicationsinggdbinvisualstudiocode、configurethelaunch.jsonfilecorectly; keysettingsincludespecifiedtheexexecutable with "program"、「gdb」に「gdb」と「type」を「cppdbg」に設定し、「ex」を使用します

theautokeywordinc deducestheTypeofavariaible fromitializer、makingcodecleanerandmoremaintable.1.特に、特にコンペルスティペステルター。2

TagDispatchingは、タイプタグを使用して、コンピレーション期間中に最適な関数過負荷を選択して、効率的な多型を実現します。 1。STD:: ITERATOR_TRAITSを使用して、Iteratorカテゴリタグを取得します。 2。複数のdo_advance過負荷関数を定義し、それぞれRandom_access_iterator_tag、bidrectional_iterator_tag、input_iterator_tagを処理します。 3.主な関数MY_ADVANCEは、派生したタグタイプに基づいて対応するバージョンを呼び出して、コンパイル期間の決定中にランタイムオーバーヘッドがないことを確認します。 4.このテクノロジーは、STD :: Advanceなどの標準ライブラリによって採用されており、拡張カスタマイズをサポートしています。
