logo

فرز الشجرة

نوع الشجرة هي خوارزمية فرز تعتمد على شجرة البحث الثنائية بنية البيانات. يقوم أولاً بإنشاء شجرة بحث ثنائية من عناصر قائمة الإدخال أو المصفوفة ثم يقوم بإجراء اجتياز بالترتيب على شجرة البحث الثنائية التي تم إنشاؤها للحصول على العناصر بترتيب مفروز. 

الخوارزمية:  

    الخطوة 1:خذ العناصر المدخلة في صفيف.الخطوة 2:قم بإنشاء شجرة بحث ثنائية عن طريق إدراج عناصر البيانات من المصفوفة في ملف شجرة البحث الثنائية .الخطوة 3:قم بإجراء الاجتياز بالترتيب على الشجرة للحصول على العناصر بالترتيب المفرز.

تطبيقات فرز الشجرة:

  • استخدامه الأكثر شيوعًا هو تحرير العناصر عبر الإنترنت: بعد كل تثبيت، تتوفر مجموعة من الكائنات التي تمت مشاهدتها حتى الآن في برنامج منظم.
  • إذا كنت تستخدم شجرة تباعد كشجرة بحث ثنائية، فإن الخوارزمية الناتجة (وتسمى splaysort) لها خاصية إضافية وهي أنها فرز تكيفي مما يعني أن وقت عملها أسرع من O (n log n) للمدخلات الافتراضية.

وفيما يلي تنفيذ النهج المذكور أعلاه:

C++
// C++ program to implement Tree Sort #include   using namespace std; struct Node {  int key;  struct Node *left *right; }; // A utility function to create a new BST Node struct Node *newNode(int item) {  struct Node *temp = new Node;  temp->key = item;  temp->left = temp->right = NULL;  return temp; } // Stores inorder traversal of the BST // in arr[] void storeSorted(Node *root int arr[] int &i) {  if (root != NULL)  {  storeSorted(root->left arr i);  arr[i++] = root->key;  storeSorted(root->right arr i);  } } /* A utility function to insert a new  Node with given key in BST */ Node* insert(Node* node int key) {  /* If the tree is empty return a new Node */  if (node == NULL) return newNode(key);  /* Otherwise recur down the tree */  if (key < node->key)  node->left = insert(node->left key);  else if (key > node->key)  node->right = insert(node->right key);  /* return the (unchanged) Node pointer */  return node; } // This function sorts arr[0..n-1] using Tree Sort void treeSort(int arr[] int n) {  struct Node *root = NULL;  // Construct the BST  root = insert(root arr[0]);  for (int i=1; i<n; i++)  root = insert(root arr[i]);  // Store inorder traversal of the BST  // in arr[]  int i = 0;  storeSorted(root arr i); } // Driver Program to test above functions int main() {  //create input array  int arr[] = {5 4 7 2 11};  int n = sizeof(arr)/sizeof(arr[0]);  treeSort(arr n);  for (int i=0; i<n; i++)  cout << arr[i] << ' ';  return 0; } 
Java
// Java program to  // implement Tree Sort class GFG  {  // Class containing left and  // right child of current   // node and key value  class Node   {  int key;  Node left right;  public Node(int item)   {  key = item;  left = right = null;  }  }  // Root of BST  Node root;  // Constructor  GFG()   {   root = null;   }  // This method mainly  // calls insertRec()  void insert(int key)  {  root = insertRec(root key);  }    /* A recursive function to   insert a new key in BST */  Node insertRec(Node root int key)   {  /* If the tree is empty  return a new node */  if (root == null)   {  root = new Node(key);  return root;  }  /* Otherwise recur  down the tree */  if (key < root.key)  root.left = insertRec(root.left key);  else if (key > root.key)  root.right = insertRec(root.right key);  /* return the root */  return root;  }    // A function to do   // inorder traversal of BST  void inorderRec(Node root)   {  if (root != null)   {  inorderRec(root.left);  System.out.print(root.key + ' ');  inorderRec(root.right);  }  }  void treeins(int arr[])  {  for(int i = 0; i < arr.length; i++)  {  insert(arr[i]);  }    }  // Driver Code  public static void main(String[] args)   {  GFG tree = new GFG();  int arr[] = {5 4 7 2 11};  tree.treeins(arr);  tree.inorderRec(tree.root);  } } // This code is contributed // by Vibin M 
Python3
# Python3 program to  # implement Tree Sort # Class containing left and # right child of current  # node and key value class Node: def __init__(selfitem = 0): self.key = item self.leftself.right = NoneNone # Root of BST root = Node() root = None # This method mainly # calls insertRec() def insert(key): global root root = insertRec(root key) # A recursive function to  # insert a new key in BST def insertRec(root key): # If the tree is empty # return a new node if (root == None): root = Node(key) return root # Otherwise recur # down the tree  if (key < root.key): root.left = insertRec(root.left key) elif (key > root.key): root.right = insertRec(root.right key) # return the root return root # A function to do  # inorder traversal of BST def inorderRec(root): if (root != None): inorderRec(root.left) print(root.key end = ' ') inorderRec(root.right) def treeins(arr): for i in range(len(arr)): insert(arr[i]) # Driver Code arr = [5 4 7 2 11] treeins(arr) inorderRec(root) # This code is contributed by shinjanpatra 
C#
// C# program to  // implement Tree Sort using System; public class GFG  {  // Class containing left and  // right child of current   // node and key value  public class Node   {  public int key;  public Node left right;  public Node(int item)   {  key = item;  left = right = null;  }  }  // Root of BST  Node root;  // Constructor  GFG()   {   root = null;   }  // This method mainly  // calls insertRec()  void insert(int key)  {  root = insertRec(root key);  }  /* A recursive function to   insert a new key in BST */  Node insertRec(Node root int key)   {  /* If the tree is empty  return a new node */  if (root == null)   {  root = new Node(key);  return root;  }  /* Otherwise recur  down the tree */  if (key < root.key)  root.left = insertRec(root.left key);  else if (key > root.key)  root.right = insertRec(root.right key);  /* return the root */  return root;  }  // A function to do   // inorder traversal of BST  void inorderRec(Node root)   {  if (root != null)   {  inorderRec(root.left);  Console.Write(root.key + ' ');  inorderRec(root.right);  }  }  void treeins(int []arr)  {  for(int i = 0; i < arr.Length; i++)  {  insert(arr[i]);  }  }  // Driver Code  public static void Main(String[] args)   {  GFG tree = new GFG();  int []arr = {5 4 7 2 11};  tree.treeins(arr);  tree.inorderRec(tree.root);  } } // This code is contributed by Rajput-Ji  
JavaScript
<script> // Javascript program to  // implement Tree Sort // Class containing left and // right child of current  // node and key value class Node {  constructor(item) {  this.key = item;  this.left = this.right = null;  } } // Root of BST let root = new Node(); root = null; // This method mainly // calls insertRec() function insert(key) {  root = insertRec(root key); } /* A recursive function to  insert a new key in BST */ function insertRec(root key) {  /* If the tree is empty  return a new node */  if (root == null) {  root = new Node(key);  return root;  }  /* Otherwise recur  down the tree */  if (key < root.key)  root.left = insertRec(root.left key);  else if (key > root.key)  root.right = insertRec(root.right key);  /* return the root */  return root; } // A function to do  // inorder traversal of BST function inorderRec(root) {  if (root != null) {  inorderRec(root.left);  document.write(root.key + ' ');  inorderRec(root.right);  } } function treeins(arr) {  for (let i = 0; i < arr.length; i++) {  insert(arr[i]);  } } // Driver Code let arr = [5 4 7 2 11]; treeins(arr); inorderRec(root); // This code is contributed // by Saurabh Jaiswal </script> 

الإخراج
2 4 5 7 11 

تحليل التعقيد:

متوسط ​​تعقيد وقت الحالة: O(n log n) تستغرق إضافة عنصر واحد إلى شجرة البحث الثنائية في المتوسط ​​وقتًا O(log n). لذلك فإن إضافة عناصر n سوف يستغرق وقتًا O(n log n).



أسوأ حالة تعقيد الوقت: على2). يمكن تحسين التعقيد الزمني الأسوأ لفرز الأشجار باستخدام شجرة بحث ثنائية ذاتية التوازن مثل Red Black Tree AVL Tree. سيستغرق استخدام Tree Sort للشجرة الثنائية ذاتية التوازن وقتًا O(n log n) لفرز المصفوفة في أسوأ الحالات. 

المساحة المساعدة: على)