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

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

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

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

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

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

عمليات

العمليات على شجرة البحث الثنائية تطلب مقارنات بين العقد. هذه المقارنات تتم عن طريق استدعاء مقارن (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. ^ ا ب بول إي. بلاك. "قاموس الخوارزميات وهياكل البيانات" (بالإنجليزية). المعهد الوطني للمعايير والتقانة. 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

انظر أيضًا


Read other articles:

I'm Not DeadAlbum studio karya P!nkDirilis4 April 2006 (2006-04-04)GenrePop rock, dance-rock, electro rockDurasi54:07LabelLaFace, ZombaProduserMax Martin, Billy Mann, MachoPsycho, Christopher Rojas, Butch Walker, Lukasz Gottwald, Josh Abraham, Pink (Produser Eksekutif)Kronologi P!nk Try This(2003)Try This2003 I'm Not Dead(2006) Funhouse(2008)Funhouse2008 Templat:Extra album cover 2 Singel dalam album I'm Not Dead Stupid GirlsDirilis: 7 Februari 2006 Who KnewDirilis: 8 Mei 2006 U ...

 

 

Parish in Louisiana, United States Parish in Louisiana, United StatesBossier ParishParishParish of BossierRenovated Bossier Parish Courthouse in BentonLocation within the U.S. state of LouisianaLouisiana's location within the U.S.Country United StatesState LouisianaRegionNorth LouisianaFoundedFebruary 24, 1843Named forPierre BossierParish seatBentonLargest cityBossier CityArea • Total2,250 km2 (867 sq mi) • Land2,200 km2 (840 sq ...

 

 

2008 Georgia Democratic presidential primary ← 2004 February 5, 2008 (2008-02-05) 2012 → ← DEID (caucus) →102 Democratic National Convention delegates (87 pledged, 15 unpledged)The number of pledged delegates received is determined by the popular vote   Candidate Barack Obama Hillary Clinton Home state Illinois New York Delegate count 60 27 Popular vote 704,247 330,026 Percentage 66.39% 31.11% Primary results by c...

يفتقر محتوى هذه المقالة إلى الاستشهاد بمصادر. فضلاً، ساهم في تطوير هذه المقالة من خلال إضافة مصادر موثوق بها. أي معلومات غير موثقة يمكن التشكيك بها وإزالتها. (يناير 2019) تل عرن الاسم الرسمي تل عرن الإحداثيات 36°7′23″N 37°20′13″E / 36.12306°N 37.33694°E / 36.12306; 37.33694 تقسيم إداري ...

 

 

† Человек прямоходящий Научная классификация Домен:ЭукариотыЦарство:ЖивотныеПодцарство:ЭуметазоиБез ранга:Двусторонне-симметричныеБез ранга:ВторичноротыеТип:ХордовыеПодтип:ПозвоночныеИнфратип:ЧелюстноротыеНадкласс:ЧетвероногиеКлада:АмниотыКлада:Синапсиды�...

 

 

Substitute for blood in a theatrical or cinematic performance Fake blood redirects here. For the musician also known as Fake Blood, see Theo Keating. The bloodred color of iron thiocyanate can simulate the appearance of blood. Theatrical blood, stage blood or fake blood is anything used as a substitute for blood in a theatrical or cinematic performance. For example, in the special effects industry, when a director needs to simulate an actor being shot or cut, a wide variety of chemicals and n...

Disambiguazione – Se stai cercando l'omonima professione, vedi Dentista. Elementi dell'organo dentale L'odontoiatria (dal greco ὀδούς, ὀδόντος: «dente» + ἰατρεία: «cura», lett. cura dei denti) è la branca della medicina che si occupa della prevenzione, della diagnosi e della terapia delle patologie dentali. Essa ricorre, altresì, alla sostituzione degli elementi dentali perduti o non suscettibili di terapia conservativa mediante la riabilitazione protesica denta...

 

 

حسن كامي معلومات شخصية الميلاد 2 نوفمبر 1936   القاهرة  الوفاة 14 ديسمبر 2018 (82 سنة)   القاهرة  مواطنة مصر  الحياة العملية المدرسة الأم جامعة القاهرة (التخصص:قانون) (الشهادة:إجازة جامعية)  المهنة مغني أوبرا،  وممثل  اللغات العربية  المواقع IMDB صفحته على IMDB ...

 

 

本條目存在以下問題,請協助改善本條目或在討論頁針對議題發表看法。 此條目可参照英語維基百科相應條目来扩充。 (2022年12月23日)若您熟悉来源语言和主题,请协助参考外语维基百科扩充条目。请勿直接提交机械翻译,也不要翻译不可靠、低品质内容。依版权协议,译文需在编辑摘要注明来源,或于讨论页顶部标记{{Translated page}}标签。 此條目需要补充更多来源。 (2022年...

American jazz musician Benny Morton (January 31, 1907 – December 28, 1985)[1] was an American jazz trombonist, most associated with the swing genre. Career He was born in New York, United States.[2] One of his first jobs was working with Clarence Holiday, and he appeared with Clarence's daughter Billie Holiday towards the end of her life on The Sound of Jazz.[2] Morton was a member of pianist Teddy Wilson's Sextet throughout the early 1940s. In the 1960s he was part ...

 

 

المجلس الوطني الكندي للبحوث المجلس الوطني الكندي للبحوث تفاصيل الوكالة الحكومية البلد كندا  تأسست 1916  المركز أوتاوا45°26′46″N 75°37′01″W / 45.44623°N 75.61698°W / 45.44623; -75.61698    الإدارة موقع الويب الموقع الرسمي  تعديل مصدري - تعديل   المجلس الوطني الكندي للبح�...

 

 

بيرلينجتون   الإحداثيات 43°19′30″N 79°48′00″W / 43.325°N 79.8°W / 43.325; -79.8   [1] تاريخ التأسيس 1874  تقسيم إداري  البلد كندا[2][3]  خصائص جغرافية  المساحة 185.66 كيلومتر مربع  ارتفاع 74 متر  عدد السكان  عدد السكان 186948 (2021)[4]  الكثافة السكانية 1...

.hn

.hnDiperkenalkan16 April 1993Jenis TLDtop-level domain kode negaraStatusAktifRegistriRed de Desarrollo Sostenible HondurasSponsorRed de Desarrollo Sostenible HondurasPemakaian yang diinginkanEntitas yang berhubungan dengan  HondurasPemakaian aktualMendapat beberapa penggunaan di HondurasPembatasanTak adaStrukturRegistrasi dilakukan secara langsung pada tingkat keduaDokumenGeneral policiesKebijakan sengketaConflict policyDNSSECyaSitus webwww.nic.hnpunto.hn.hn adalah top-level domain kode ...

 

 

جمهورية مصر العربيةوزارة الزراعة واستصلاح الأراضي وزارة الزراعة واستصلاح الأراضي (مصر)الشعار البلد  مصر المقر الرئيسي العاصمة الإدارية، محافظة القاهرة تاريخ التأسيس 1913 (منذ 111 سنة) النوع وزارة العضوية مجلس الوزراء المصري اللغات الرسمية العربية الوزير السيد مرزوق القص...

 

 

Spiritual attainments in Indian religions Not to be confused with the African Siddi or the Karnataka Siddi. In Indian religions, Siddhis (Sanskrit: सिद्धि siddhi; fulfillment, accomplishment) are material, paranormal, supernatural, or otherwise magical powers, abilities, and attainments that are the products of yogic advancement through sādhanās such as meditation and yoga.[1] The term ṛddhi (Pali: iddhi, psychic powers) is often used interchangeably in Buddhism. Etymo...

The Red Detachment of Women. Soldiers of the Women's Detachment performing rifle drill in Act II, from the 1972 National Ballet of China production. Red Detachment of WomenSimplified Chinese红色娘子军Traditional Chinese紅色娘子軍TranscriptionsStandard MandarinHanyu PinyinHóngsè niángzǐ jūnWade–GilesHung2-se4 niang2-tzu3 chün1IPA[xʊ̌ŋ.sɤ̂ njǎŋ.tsɨ̀ tɕýn]Yue: CantoneseJyutpingHung4-sik1 noeng4-zi2 gwan1 The Red Detachment of...

 

 

La bataille de Scheveningen, lors de la Première guerre anglo-néerlandaise, peinte par Jan Abrahamsz Beerstraaten. Les guerres anglo-néerlandaises — Anglo-Dutch Wars en anglais et Engels-Nederlandse oorlogen en néerlandais — sont une série de quatre guerres au XVIIe siècle et au XVIIIe siècle entre l'Angleterre puis le Royaume de Grande-Bretagne et les Provinces-Unies. Leur enjeu est le contrôle des échanges commerciaux internationaux ; de ce fait, la qua...

 

 

هذه المقالة تحتاج للمزيد من الوصلات للمقالات الأخرى للمساعدة في ترابط مقالات الموسوعة. فضلًا ساعد في تحسين هذه المقالة بإضافة وصلات إلى المقالات المتعلقة بها الموجودة في النص الحالي. (يوليو 2019) Mafdet تعديل مصدري - تعديل   مافدت أحد آلهة الأساطير المصرية على هيئة قط، وهي رمز...

Cet article est une ébauche concernant une localité chinoise. Vous pouvez partager vos connaissances en l’améliorant (comment ?) selon les recommandations des projets correspondants. Putian 莆田 Viaduc de la ligne Xiangtang–Putian (en). Administration Pays Chine Province ou région autonome Fujian Statut administratif Ville-préfecture Code postal Ville : 351100[1] Indicatif +86 (0)0594[1] Immatriculation 闽B Démographie 2 900 000 hab. (2018 et 2020) ...

 

 

2009 video game 2009 video gameKingdom Hearts 358/2 DaysNorth American box art featuring the main characters, from left: Xion, Roxas, Axel, Riku, and Mickey Mouse.Developer(s)h.a.n.d.Publisher(s)Square EnixDirector(s)Tetsuya NomuraProducer(s)Patrick ChenDesigner(s)Hiroyuki ItouYasuhiro SatoProgrammer(s)Yoshikazu HosodaArtist(s)Tetsuya NomuraWriter(s)Tetsuya NomuraYukari IshidaTomoco KanemakiComposer(s)Yoko ShimomuraSeriesKingdom HeartsPlatform(s)Nintendo DS[4]ReleaseJP: May 30, 2009&#...