ต้นไม้ค้นหาไบนารีเป็นต้นไม้ไบนารีที่มีคุณสมบัติบางอย่าง คุณสมบัติเหล่านี้เป็นเหมือนด้านล่าง −
- ทุกแผนผังการค้นหาไบนารีเป็นทรีไบนารี
- ลูกด้านซ้ายทุกคนจะมีค่าน้อยกว่ารูท
- ลูกที่ถูกต้องทุกคนจะมีค่ามากกว่ารูท
- แผนผังการค้นหาแบบไบนารีในอุดมคติจะไม่เก็บค่าเดิมซ้ำ 2 ครั้ง
สมมติว่าเรามีต้นไม้ต้นหนึ่งแบบนี้ -
ต้นไม้นี้เป็นต้นไม้การค้นหาแบบไบนารีหนึ่งต้น เป็นไปตามคุณสมบัติที่กล่าวถึงทั้งหมด หากเราสำรวจองค์ประกอบในโหมดการข้ามผ่านแบบไม่เรียงลำดับ เราก็จะได้ 5, 8, 10, 15, 16, 20, 23 ให้เราดูโค้ดเดียวเพื่อทำความเข้าใจว่าเราจะใช้สิ่งนี้ในโค้ด C++ ได้อย่างไร
ตัวอย่าง
#include<iostream> using namespace std; class node{ public: int h_left, h_right, bf, value; node *left, *right; }; class tree{ private: node *get_node(int key); public: node *root; tree(){ root = NULL; //set root as NULL at the beginning } void inorder_traversal(node *r); node *insert_node(node *root, int key); }; node *tree::get_node(int key){ node *new_node; new_node = new node; //create a new node dynamically new_node->h_left = 0; new_node->h_right = 0; new_node->bf = 0; new_node->value = key; //store the value from given key new_node->left = NULL; new_node->right = NULL; return new_node; } void tree::inorder_traversal(node *r){ if(r != NULL){ //When root is present, visit left - root - right inorder_traversal(r->left); cout << r->value << " "; inorder_traversal(r->right); } } node *tree::insert_node(node *root, int key){ if(root == NULL){ return (get_node(key)); //when tree is empty, create a node as root } if(key < root->value){ //when key is smaller than root value, go to the left root->left = insert_node(root->left, key); }else if(key > root->value){ //when key is greater than root value, go to the right root->right = insert_node(root->right, key); } return root; //when key is already present, do not insert it again } main(){ node *root; tree my_tree; //Insert some keys into the tree. my_tree.root = my_tree.insert_node(my_tree.root, 10); my_tree.root = my_tree.insert_node(my_tree.root, 5); my_tree.root = my_tree.insert_node(my_tree.root, 16); my_tree.root = my_tree.insert_node(my_tree.root, 20); my_tree.root = my_tree.insert_node(my_tree.root, 15); my_tree.root = my_tree.insert_node(my_tree.root, 8); my_tree.root = my_tree.insert_node(my_tree.root, 23); cout << "In-Order Traversal: "; my_tree.inorder_traversal(my_tree.root); }
ผลลัพธ์
In-Order Traversal: 5 8 10 15 16 20 23