Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม

ทรีการค้นหาไบนารีในโครงสร้างข้อมูล


ต้นไม้ค้นหาไบนารีเป็นต้นไม้ไบนารีที่มีคุณสมบัติบางอย่าง คุณสมบัติเหล่านี้เป็นเหมือนด้านล่าง −

  • ทุกแผนผังการค้นหาไบนารีเป็นทรีไบนารี
  • ลูกด้านซ้ายทุกคนจะมีค่าน้อยกว่ารูท
  • ลูกที่ถูกต้องทุกคนจะมีค่ามากกว่ารูท
  • แผนผังการค้นหาแบบไบนารีในอุดมคติจะไม่เก็บค่าเดิมซ้ำ 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