شجرة بحث ثنائية

معلومات عامة| صنف فرعي من | 
search tree (en) ترجمشجرة ثنائية عدل القيمة على Wikidata |
| البداية | 
1960 عدل القيمة على Wikidata |
| يدرسه | 
نظرية البيان عدل القيمة على Wikidata |
| المكتشف أو المخترع | 
Andrew Donald Booth (en) ترجم عدل القيمة على Wikidata |
| زمن الاكتشاف أو الاختراع | 
1960 عدل القيمة على Wikidata |
| أسوأ حالة تعقيد مكاني | 
{\displaystyle O(n)} عدل القيمة على Wikidata |
| متوسط التعقيد المكاني | 
{\displaystyle O(n)} عدل القيمة على Wikidata |
| موصوف في وصلة | 
 عدل القيمة على Wikidata |

تعديل - تعديل مصدري - تعديل ويكي بياناتحول القالب

في علم الحاسوب، **شجرة بحث ثنائية** (بالإنجليزية: Binary Search Tree)‏ اختصارًا (BST)، والتي يطلق عليها أيضًا أحيانًا شجرة بحث ثنائية مرتبة أو منظمة، هي شجرة ثنائية التي لديها هذه الخصائص التالية:

* الشجرة الجزئية اليسرى لعقدة ما تحتوي فقط على عقد مع قيم أقل من قمية العقدة نفسها.
* الشجرة الجزئية اليمنى لعقدة ما تحتوي فقط على عقد مع قيم أكبر من قمية العقدة نفسها.
* كلتا الشجرتين الجزئيتين اليمنى واليسرى هما شجرتا بحث ثنائيتان.

بشكل عام، المعلومات التي تمثلها كل عقدة هي سجلات وليست فقط عناصر بيانات أحادية.

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

عمليات
------

العمليات على شجرة البحث الثنائية تطلب مقارنات بين العقد. هذه المقارنات تتم عن طريق استدعاء مقارن (comparator)، والذي هو عبارة عن دالة التي تحسب الترتيب لأي قيمتين. ويكون معرفا حسب اللغة المنفذة بها الشجرة.

### بحث

البحث في شجرة بحث ثنائية على قيمة معينة يمكن أن يكون عوديا (recursive) أو تكرايا (iterative). الشرح هنا يغطي الطريقة العودية.

نبدأ بفحص العقدة الجذر. إذا كانت الشجرة null، إذن القيمة المراد البحث عنها لا توجد في الشجرة. وإلا، إذا كانت القيمة مساوية للجذر، ينجح البحث. إذا كانت القيمة أصغر من الجذر، نبحث في الشجرة الفرعية اليسرى. بصورة مشابهة، إذا كانت أكبر من الجذر، نبحث في الشجرة الفرعية اليمنى. نكرر هذه العملية حتى يتم إيجاد القيمة أو نصل إلا شجرة فرعية null. إذا لم يتم إيجاد القيمة المراد البحث عنها قبل أن نصل إلى شجرة فرعية null، إذن العنصر غير موجود في الشجرة.

هذه هي خوارزمية البحث في لغة بايثون:

```
# 'node' refers to the parent-node in this case
 def search\_binary\_tree(node, key):
     if node is None:
         return None  # key not found
     if key < node.key:
         return search\_binary\_tree(node.leftChild, key)
     elif key > node.key:
         return search\_binary\_tree(node.rightChild, key)
     else:  # key is equal to node key
         return node.value  # found key

```

أو بلغة هاسكل:

```
 searchBinaryTree \_ NullNode = Nothing
 searchBinaryTree key (Node nodeKey nodeValue (leftChild, rightChild)) =
 case compare key nodeKey of
 LT -> searchBinaryTree key leftChild
 GT -> searchBinaryTree key rightChild
 EQ -> Just nodeValue

```

هذه العملية تطلب زمن (O(log *n* بالحالة المتوسطة، ولكن تطلب (O(*n* بأسوء حالة.

على افتراض أن `BinarySearchTree` هي كلاس يحتوي على دالة `(search(int` ومؤشر إلى العقدة الجذر، الخوارزمية أيضا منفذة بالطريقة التكرارية.

```
bool BinarySearchTree::search(int val)
{
 Node \*next = this->root();
 
 while (next != NULL) {
 if (val == next->value()) {
 return true;
 } else if (val < next->value()) {
 next = next->left(); 
 } else {
 next = next->right();
 }
 } 
 
 // غير موجود
 return false;
}

```

### إدخال

يبدأ الإدخال كما يبدأ البحث; إذا لم تكن القيمة المراد إدخالها مساوية للجذر، نبحث في الشجرة الفرعية اليسرى أو اليمنى كما من قبل. أخيرا، سنصل إلى عقدة خارجية ونضيف القيمة كابن يميني أو يساري، اعتمادا على قيمة العقدة. وبعبارة أخرى، نفحص الجذر وندخل العقدة الجديدة في الشجرة الفرعية اليسرى إذا كانت قيمتها أصغر من قمية الجذر، أو في الشجرة الفرعية اليمنى إذا كانت قيمتها أكبر من قيمة الجذر.

هكذا يمكن تنفيذ إدخال في شجرة البحث الثنائية بسي++:

```
 /\* Inserts the node pointed to by "newNode" into the subtree rooted at "treeNode" \*/
 void InsertNode(Node\* &treeNode, Node \*newNode)
 {
 if (treeNode == NULL)
 treeNode = newNode;
 else if (newNode->key < treeNode->key)
 InsertNode(treeNode->left, newNode);
 else
 InsertNode(treeNode->right, newNode);
 }

```

وهنا تنفيذ بالطريقة التكرارية للإدخال في شجرة البحث الثنائية في جافا:

```
private Node m\_root;

public void insert(int data) {
 if (m\_root == null) {
 m\_root = new TreeNode(data, null, null);
 return;
 }
 Node root = m\_root;
 while (root != null) {
 // Not the same value twice
 if (data == root.getData()) {
 return;
 } else if (data < root.getData()) {
 // insert left
 if (root.getLeft() == null) {
 root.setLeft(new TreeNode(data, null, null));
 return;
 } else {
 root = root.getLeft();
 }
 } else {
 // insert right
 if (root.getRight() == null) {
 root.setRight(new TreeNode(data, null, null));
 return;
 } else {
 root = root.getRight();
 }
 }
 }
}

```

وهنا تنفيذ بالطريقة العودية للإدخال:

```
private Node m\_root;

public void insert(int data){
 if (m\_root == null) {
 m\_root = TreeNode(data, null, null); 
 }else{
 internalInsert(m\_root, data);
 }
}
 
private static void internalInsert(Node node, int data){
 // Not the same value twice
 if (data == node.getValue()) {
 return;
 } else if (data < node.getValue()) {
 if (node.getLeft() == null) {
 node.setLeft(new TreeNode(data, null, null));
 }else{
 internalInsert(node.getLeft(), data);
 }
 }else{
 if (node.getRight() == null) {
 node.setRight(new TreeNode(data, null, null));
 }else{
 internalInsert(node.getRight(), data);
 } 
 }
}

```

### ترتيب

بالإمكان استخدام شجرة البحث الثنائية لتنفيذ خوارزمية بحث كفئة. ندخل كل القيم المراد ترتيها إلى شجرة بحث ثنائية، وبعد ذلك نمر على الشجرة بالترتيب بانين النتيجة:

```
def build\_binary\_tree(values):
    tree = None
    for v in values:
        tree = binary\_tree\_insert(tree, v)
    return tree

def get\_inorder\_traversal(root):
 '''
 Returns a list containing all the values in the tree, starting at \*root\*.
 Traverses the tree in-order(leftChild, root, rightChild).
 '''
    result = []
    traverse\_binary\_tree(root, lambda element: result.append(element))
    return result

```

مراجع
-----

1. 1 2  بول إي. بلاك. "قاموس الخوارزميات وهياكل البيانات" (بالإنجليزية). المعهد الوطني للمعايير والتقنية. Retrieved 2015-04-11.
2. ↑  Gilberg، R.؛ Forouzan، B. (2001)، "8"، *Data Structures: A Pseudocode Approach With C++*، Pacific Grove, CA: Brooks/Cole، ص. 339، ISBN:0-534-95216-X، مؤرشف من الأصل في 2020-04-17

انظر أيضًا
----------

* شجرة (بنية بيانات)
* شجرة ثنائية
* بنية بيانات
* خوارزمية بحث
* شجرة التحليل
* شجرة فنويك (تُعرف أيضاً باسم الشجرة المفهرسة الثنائية).

|  |  |
| --- | --- |
| مشاريع شقيقة | في كومنز صور وملفات عن: شجرة بحث ثنائية |



| * ع
* ن
* ت
بنى شجرية في علم الحاسوب |
| --- |
| أشجار ثنائية | 
* شجرة بحث ثنائية
* Cartesian tree
* MVP Tree
* Top tree
* T-tree
* Left-child right-sibling binary tree

 |
| أشجار بحث ثنائية متزنة | 
* AA tree
* شجرة AVL
* LLRB tree
* شجرة أحمر-أسود
* Scapegoat tree
* Splay tree
* Treap

 |
| أشجار باير | 
* شجرة بي بلس
* بي - تري
* Bx-tree
* UB-tree
* 2-3 tree
* 2-3-4 tree
* (a,b)-tree
* Dancing tree
* إتش تري

 |
| الشجرة الرقميةs | 
* Suffix tree
* Radix tree
* Hash tree
* Ternary search tree
* X-fast trie
* Y-fast trie

 |
| Binary space partitioning (BSP) trees | 
* Quadtree
* Octree
* *k*-d tree
* Implicit *k*-d tree
* VP tree

 |
| أشجار غير ثنائية | 
* Exponential tree
* Fusion tree
* Interval tree
* PQ tree
* Range tree
* SPQR tree
* Van Emde Boas tree

 |
| Spatial data partitioning trees | 
* R-tree
* R+ tree
* R\* tree
* X-tree
* M-tree
* Segment tree
* Hilbert R-tree
* Priority R-tree

 |
| بنى شجرية أخرى | 
* الكومة
* Hash calendar
* Merkle tree
* Finger tree
* Order statistic tree
* Metric tree
* Cover tree
* BK-tree
* Doubly chained tree
* iDistance
* Link-cut tree
* شجرة فنويك
* Log-structured merge-tree

 |

| * ع
* ن
* ت
هياكل البيانات |
| --- |
| الأنماط | 
* Collection
* حاوية

 |
| مجردة | 
* مصفوفة ارتباطية
	+ Multimap
* طابور
	+ Double-ended queue
* طابور الأولوية
* Double-ended priority queue
* قائمة
* مجموعة
	+ متعددة
	+ منفصلة
* مكدس

 |
| مصفوفية | 
* مصفوفة البت
* مخزن بيانات مؤقت
* مصفوفة ديناميكية
* جدول تجزئة
* Hashed array tree
* Sparse array

 |
| مترابطة | 
* Association list
* قائمة متصلة
* Skip list
* Unrolled linked list
* XOR linked list

 |
| شجرية | 
* بي - تري
* شجرة بحث ثنائية
	+ AA
	+ شجرة AVL
	+ شجرة أحمر-أسود
	+ شجرة بحث ثنائية متزنة
	+ splay
* كومة
	+ binary
	+ كومة ذات حدين
	+ Fibonacci
* R-tree
	+ R\*
	+ R+
	+ Hilbert
* الشجرة الرقمية
	+ Hash tree

 |
| بيانية | 
* Binary decision diagram
* بيان موجه خال من الحلقات

 |
| 
* قائمة هياكل البيانات

 |

* أيقونة بوابةبوابة رياضيات
* أيقونة بوابةبوابة علم الحاسوب