Binary search tree (BST) រក្សាទុក keys តាមលំដាប់លំដោយ៖ គ្រប់ key ក្នុង subtree ខាងឆ្វេងរបស់ node គឺតូចជាង ហើយគ្រប់ key ក្នុង subtree ខាងស្ដាំគឺធំជាង។ លក្ខខណ្ឌនេះអនុញ្ញាតឱ្យអ្នកស្វែងរក បញ្ចូល ឬលុប key ដោយគ្រាន់តែដើរតាមផ្លូវមួយចុះពី root ហើយជ្រើសរើសបត់ឆ្វេង ឬស្ដាំនៅ node នីមួយៗ។ ឧបករណ៍នេះបង្ហាញចលនាដើរសម្រាប់ insert, search និង delete ហើយដើមឈើនឹងរៀបចំទីតាំងឡើងវិញយ៉ាងរលូនក្រោយប្រតិបត្តិការនីមួយៗ។
ការលុបបង្ហាញទាំង 3 ករណី៖ node ស្លឹក (leaf) ត្រូវបានដកចេញភ្លាមៗ, node ដែលមានកូនមួយត្រូវបានជំនួសដោយកូនរបស់វា និង node ដែលមានកូនពីរត្រូវយកតម្លៃពី in-order successor របស់វា។ ប៊ូតុង traversal ដំណើរការការរុករកតាម in-order, pre-order, post-order និង level-order (breadth-first) ព្រមទាំងបង្ហាញបញ្ជី keys តាមលំដាប់ដែលបានទៅដល់។
របៀបប្រើឧបករណ៍ ឧបករណ៍បង្ហាញ Binary Search Tree
- ចុច Random tree ឬវាយបញ្ចូល key ម្តងមួយៗ រួចចុច Insert។
- វាយបញ្ចូល key ហើយចុច Search ឬ Delete ដើម្បីមើលផ្លូវដើរចុះពី root។
- ចុច In-order, Pre-order, Post-order ឬ Level order ដើម្បីមើលការ traverse និងលទ្ធផលរបស់វា។
- ចុចទៅមុខ ឬថយក្រោយ និងតាមដានបន្ទាត់ pseudocode ដែលបានបន្លិច។
ហេតុអ្វីប្រើ ឧបករណ៍បង្ហាញ Binary Search Tree របស់ ToolOrca
- Insert, search និង delete ជាមួយចលនាបង្ហាញផ្លូវដើរ
- បង្ហាញគ្រប់ករណីលុបទាំង 3 រួមទាំង in-order successor
- Traversals តាមបែប In-order, pre-order, post-order និង level-order
- ការរៀបចំប្លង់ដើមឈើយ៉ាងរលូនបន្ទាប់ពីប្រតិបត្តិការនីមួយៗ
- ឧបករណ៍រាប់ចំនួន node, កម្ពស់ និងចំនួន nodes ដែលបានឆ្លងកាត់
- កូដជាភាសា C++, Java, Python និង JavaScript
របៀបដែល binary search tree ដំណើរការ
Node នីមួយៗមាន key មួយ និងកូនយ៉ាងច្រើនពីរ។ សម្រាប់គ្រប់ node ទាំងអស់ keys នៅក្នុង subtree ខាងឆ្វេងគឺតូចជាង ហើយ keys នៅក្នុង subtree ខាងស្ដាំគឺធំជាង។ ដើម្បីស្វែងរក ចាប់ផ្ដើមពី root៖ បើ key តូចជាងត្រូវបត់ឆ្វេង បើធំជាងត្រូវបត់ស្ដាំ ហើយឈប់នៅពេលរកឃើញ ឬជួបកន្លែងទំនេរ។ ការ insert ដើរតាមផ្លូវដូចគ្នានេះ ហើយដាក់ node ថ្មីនៅកន្លែងទំនេរនោះ។
ជំហាននីមួយៗចុះក្រោមមួយកម្រិត ដូច្នេះការចំណាយពេលអាស្រ័យលើ កម្ពស់ (height) របស់ដើមឈើ។ ក្នុងដើមឈើដែលមានតុល្យភាពល្អ (balanced tree) មាន n keys កម្ពស់គឺប្រហែល log₂ n (ត្រឹមតែ 20 កម្រិតសម្រាប់ keys មួយលាន) ត្រូវជា O(log n)។ ប៉ុន្តែប្រសិនបើ keys ត្រូវបានបញ្ចូលតាមលំដាប់រួចស្រេច នោះ node ទាំងអស់នឹងលំអៀងទៅខាងស្ដាំ ហើយដើមឈើនឹងក្លាយជាខ្សែសង្វាក់វែងដែលមានកម្ពស់ n ដែលធ្វើឱ្យប្រតិបត្តិការធ្លាក់ចុះដល់ O(n)។ ដើមឈើតម្រឹមតុល្យភាពស្វ័យប្រវត្ត (Self-balancing trees) ដូចជា AVL និង red-black tree អាចការពារបញ្ហានេះបាន។
ការលុប node៖ ករណីទាំង ៣
គ្មានកូន៖ លុប node ស្លឹកនោះចេញតែម្ដង។ មានកូនមួយ៖ ភ្ជាប់ parent របស់ node នោះទៅកាន់កូនរបស់វាដោយផ្ទាល់។ មានកូនពីរ៖ ស្វែងរក in-order successor ដែលជា key តូចបំផុតនៅក្នុង subtree ខាងស្ដាំ (បត់ស្ដាំមួយជំហាន រួចបត់ឆ្វេងរហូតដល់អស់)។ ចម្លង key របស់វាចូលក្នុង node នោះ រួចលុប successor នោះចោល ដែលវាមានកូនយ៉ាងច្រើនបំផុតត្រឹមតែមួយប៉ុណ្ណោះ។ ការប្រើប្រាស់ in-order predecessor (ធំបំផុតក្នុង subtree ឆ្វេង) ក៏អាចដំណើរការបានដូចគ្នា។
Tree Traversals
In-order (ឆ្វេង, node, ស្ដាំ) ដើរមើល keys របស់ BST តាមលំដាប់ពីតូចទៅធំ។ Pre-order (node, ឆ្វេង, ស្ដាំ) ប្រើសម្រាប់ចម្លង ឬ serialize ដើមឈើ។ Post-order (ឆ្វេង, ស្ដាំ, node) ចូលមើលកូនៗមុន parent ដែលចាំបាច់សម្រាប់ការលុបដើមឈើ ឬគណនា expression tree។ Level order ប្រើប្រាស់ queue ដើម្បីដើរមើលដើមឈើម្តងមួយកម្រិតៗ ដែលត្រូវជា breadth-first search។ វិធីទាំងបួននេះចំណាយពេលត្រឹម O(n) ដូចគ្នា។
គ្រប់ visualizer នៅលើគេហទំព័រនេះដំណើរការផ្ទាល់ក្នុង browser របស់អ្នកជាមួយប៊ូតុងបញ្ជាដូចគ្នា៖ ចាក់ (Play), ផ្អាក (Pause), ទៅមុខមួយជំហាន, ថយក្រោយមួយជំហាន និងរបារលៃល្បឿន។ អ្នកក៏អាចអូសរបារកំណត់ទីតាំងដើម្បីលោតទៅជំហានណាមួយ ឬចុចលើផ្ទាំងគំនូរហើយប្រើប្រាស់ Space bar និងគ្រាប់ចុចព្រួញបានផងដែរ។
សំណួរដែលសួរញឹកញាប់
តើ binary search tree គឺជាអ្វី?
គឺជា binary tree ដែលសម្រាប់គ្រប់ node ទាំងអស់ keys នៅក្នុង subtree ខាងឆ្វេងគឺតូចជាង និង keys នៅក្នុង subtree ខាងស្ដាំគឺធំជាងជានិច្ច។ លំដាប់លំដោយនេះធ្វើឱ្យការ search, insert និង delete មានល្បឿនលឿន។
តើ Time Complexity នៃប្រតិបត្តិការ BST ស្មើប៉ុន្មាន?
O(h) ដែល h ជាកម្ពស់ដើមឈើ៖ ស្មើ O(log n) សម្រាប់ដើមឈើមានតុល្យភាពល្អ ប៉ុន្តែស្មើ O(n) ក្នុងករណីអាក្រក់បំផុតនៅពេលដើមឈើក្លាយជាបន្ទាត់ត្រង់។
តើ traversal មួយណាដែលផ្ដល់លទ្ធផលតម្រៀបតាមលំដាប់?
ការ traverse បែប In-order (subtree ឆ្វេង, node, subtree ស្ដាំ) ឆ្លងកាត់ keys នៃ BST តាមលំដាប់កើនឡើងពីតូចទៅធំ។
តើ in-order successor គឺជាអ្វី?
គឺជា key ដែលធំជាងគេបន្ទាប់នៅក្នុងដើមឈើ។ សម្រាប់ node ដែលមាន subtree ខាងស្ដាំ វាគឺជា node ឆ្វេងបំផុតនៃ subtree នោះ។ គេប្រើប្រាស់វាដើម្បីជំនួសនៅពេលលុប node ដែលមានកូនពីរ។
តើ BST ប្រៀបធៀបជាមួយ Hash Table ខុសគ្នាយ៉ាងណា?
Hash table មានល្បឿនលឿនជាងជាមធ្យម (O(1)) ប៉ុន្តែមិនរក្សាទុកលំដាប់លំដោយឡើយ។ Balanced BST ចំណាយពេល O(log n) ប៉ុន្តែវាគាំទ្រការ traverse តាមលំដាប់ ការស្វែងរក min, max និង range queries។