C二進制搜索樹示例
二進制搜索樹(BST)是一個二進制樹,其中左子樹僅包含小於節點值的節點,右子樹僅包含值大於節點值的節點,並且兩個子樹也必須是BST; 1。 C實現包括帶有價值,左和右指針的Treenode結構; 2。 BST類提供使用遞歸輔助方法的插入,搜索和內部遍歷操作; 3。插入通過比較值並避免重複物來維護BST屬性; 4。搜索通過基於比較左或右導航在O(log n)平均時間; 5。按順序打印值以排序順序訪問左,root,然後右; 6.生產的關鍵考慮包括添加一個用於內存清理的破壞者,使用AVL或紅色邏輯平衡樹,以及實現迭代方法以防止堆棧溢出,這使此示例成為對C中BST的基本理解。
這是帶有基本操作的二進制搜索樹(BST)的實用C示例:插入,搜索和按順序遍歷。

✅什麼是二進制搜索樹?
BST是一棵二進制樹:
- 節點的左子樹僅包含小於節點值的節點。
- 右子樹僅包含大於節點值的節點。
- 左右子樹都必須是二進制搜索樹。
? C實施示例
#include <iostream> 使用命名空間std; //定義樹節點的結構 struct treenode { int值; treenode*左; treenode*右; //構造函數 treenode(int val):value(val),左(nullptr),右(nullptr){} }; //二進制搜索樹類 BST類{ 民眾: treenode* root; //構造函數 bst():root(nullptr){} //公共插入功能 void insert(int value){ root = insertrecursive(root,value); } //公共搜索功能 bool搜索(int value){ 返回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); } //忽略重複(值==節點 - >值) 返回節點; } //助手:遞歸搜索 bool searchRecursive(treenode* node,int value){ if(node == nullptr){ 返回false; // 未找到 } if(node-> value == value){ 返回true; // 成立 } if(value <node-> value){ 返回searchRecursive(節點 - >左,value); } 別的 { 返回searchRecursive(node->右值,value); } } //助手:內排遍歷(左 - > root->右) void inorderRecursive(treenode* node){ if(node!= nullptr){ inorderRecursive(節點 - >左); 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)?“找到”:“找不到”)<< endl; cout <<“搜索25:” <<(tree.search(25)?“找到”:“找不到”)<< endl; 返回0; }
?輸出:
階段遍歷:20 30 40 50 60 70 80 搜索40:找到 搜索25:找不到
✅要點:
- 插入通過比較值來維護BST屬性。
- 搜索是有效的(o(log n)平均),左右行駛。
- 固定遍歷可提供排序的輸出 - BST的關鍵好處之一。
- 此版本忽略了重複的值。您可以對其進行修改以允許重複(例如,使用
或存儲計數)。
⚠️注意:
這是一個基本實現。供生產使用,請考慮:

- 內存清理(添加刪除器刪除節點)。
- 平衡(使用AVL或紅色樹木以避免偏斜的樹木)。
- 迭代版本以避免在深樹中堆疊溢出。
基本上,此示例為您提供了堅實的基礎,以了解BST在C中的工作方式。
以上是C二進制搜索樹示例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

目錄什麼是Succinct(PROVE)誰創建了Succinct(PROVE)?哪些風險投資支持Succinct(PROVE)? Succinct(PROVE)的工作原理SP1zkVM和Prover網絡OPSuccinct技術跨鏈驗證PROVE代幣經濟學代幣詳情代幣分配代幣實用程序潛在代幣持有者PROVE代幣價格預測PROVE代幣的上市前交易活動社區對PROVE代幣價格的預測為什麼要選擇Succinct? Succ

目錄什麼是Succinct(PROVE)哪些風險投資支持Succinct(PROVE)? Succinct(PROVE)的工作原理SP1zkVM和Prover網絡OPSuccinct技術跨鏈驗證PROVE代幣經濟學代幣詳情2025、2026、2027-2030年Succinct(PROVE)價格預測Succinct(PROVE)價格預測Succinct(PROVE)價格預測:交易量擴張和上市勢頭2025年至20

刪除元素時若正在迭代,必須避免使用失效迭代器。 ①正確做法是使用it=vec.erase(it),利用erase返回的有效迭代器繼續遍歷;②批量刪除推薦“erase-remove”慣用法:vec.erase(std::remove_if(vec.begin(),vec.end(),條件),vec.end()),安全且高效;③可使用反向迭代器從後往前刪除,邏輯清晰但需注意條件方向。結論:始終用erase返回值更新迭代器,禁止對已失效迭代器執行 操作,否則導致未定義行為。

theAutokeywordInc decteStheTypeOfavariable fromitsInitializer,makecodecleanerandmoraintableable.1.itredreducesverbosity,尤其是withcomplextypeslikeiterators.2.itenhancesmaintainabilitionalobilitybyautaperaimatoragationalaimatoragationalapationalabilationalabilationalapationalapationalabilabilationalabilationalapationalabilationalapationalablemaintartaptingtopypechanges.3.ithicalemenderarefornelect

TagDispatching通過類型標籤在編譯期選擇最優函數重載,實現高效多態。 1.使用std::iterator_traits獲取迭代器類別標籤;2.定義多個do_advance重載函數,分別處理random_access_iterator_tag、bidirectional_iterator_tag和input_iterator_tag;3.主函數my_advance根據推導出的標籤類型調用對應版本,確保編譯期決策無運行時開銷;4.該技術被標準庫如std::advance採用,支持擴展自定義

使用std::ifstream的seekg和tellg方法可跨平台獲取文件大小,通過打開二進製文件並定位到末尾,利用tellg()返回字節數;2.C 17及以上推薦使用std::filesystem::file_size,代碼簡潔且通過異常處理錯誤,需啟用C 17標準;3.在POSIX系統上可使用stat()函數高效獲取文件大小,適用於性能敏感場景。應根據編譯器和平台選擇合適方法,優先使用std::filesystem(若可用),否則使用ifstream保證兼容性,或在Unix系統上使用st

打開軟件或遊戲時,突然出現“應用程序無法正常啟動(0xc0000906)”的提示,許多用戶都會感到困惑,不知從何下手。實際上,這類錯誤大多源於系統文件損壞或運行庫缺失。別急著重裝系統,本文為你提供幾種簡單有效的解決方法,助你快速恢復程序運行。一、0xc0000906錯誤到底是什麼?錯誤代碼0xc0000906屬於Windows系統常見的啟動異常,通常表示程序在運行時無法加載必要的系統組件或運行環境。該問題常出現在運行大型軟件或遊戲時,主要原因可能包括:必要的運行庫未安裝或遭到破壞。軟件安裝包不完

該C 單鍊錶示例實現了插入、遍歷和刪除操作,1.使用insertAtBeginning在頭部插入節點;2.使用insertAtEnd在尾部插入節點;3.使用deleteNode按值刪除節點並返回布爾結果;4.通過display方法遍歷並打印鍊錶;5.在析構函數中釋放所有節點內存以防止洩漏;最終程序輸出驗證了這些操作的正確性,完整展示了動態數據結構的基本管理方式。
