"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > شجرة البحث الثنائية من الصفر في جافا

شجرة البحث الثنائية من الصفر في جافا

تم النشر بتاريخ 2024-07-29
تصفح:184

Binary Search Tree from Scratch in Java

مقدمة
شجرة البحث الثنائية (BST) هي نوع من الأشجار الثنائية حيث تحتوي كل عقدة على طفلين على الأكثر، يشار إليهما بالطفل الأيسر والطفل الأيمن. بالنسبة لكل عقدة، تحتوي الشجرة الفرعية اليسرى فقط على العقد ذات القيم الأقل من قيمة العقدة، وتحتوي الشجرة الفرعية اليمنى فقط على العقد ذات القيم الأكبر من قيمة العقدة. تُستخدم BSTs في عمليات البحث والإدراج والحذف الفعالة.

لماذا نستخدم شجرة البحث الثنائية؟
تقدم BSTs العديد من المزايا:

البحث الفعال: متوسط ​​التعقيد الزمني هو O(log n) للبحث والإدراج والحذف.
مجموعة العناصر الديناميكية: تدعم العمليات الديناميكية، على عكس المصفوفات الثابتة.
العناصر المرتبة: يؤدي اجتياز BST بالترتيب إلى ظهور عناصر مرتبة.
دليل خطوة بخطوة لبناء BST
الخطوة 1: تحديد بنية العقدة
الخطوة الأولى هي تحديد بنية العقدة في الشجرة. سيكون لكل عقدة ثلاث سمات: قيمة، وإشارة إلى الطفل الأيسر، وإشارة إلى الطفل الأيمن.

public class TreeNode {
    int value;
    TreeNode left;
    TreeNode right;

    TreeNode(int value) {
        this.value = value;
        this.left = null;
        this.right = null;
    }
}

الخطوة 2: إنشاء فئة BST باستخدام المُنشئ
بعد ذلك، نقوم بإنشاء فئة BST التي تحتوي على مرجع إلى جذر الشجرة وطرق إدراج العناصر.

public class BinarySearchTree {
    TreeNode root;

    public BinarySearchTree() {
        this.root = null;
    }
}

الخطوة 3: تنفيذ طريقة الإدراج
لإدراج عنصر في BST، نحتاج إلى العثور على الموضع الصحيح للعقدة الجديدة. عادة ما يتم تنفيذ طريقة الإدراج كدالة متكررة.

public void insert(int value) {
    root = insertRec(root, value);
}

private TreeNode insertRec(TreeNode root, int value) {
    // Base case: if the tree is empty, return a new node
    if (root == null) {
        root = new TreeNode(value);
        return root;
    }

    // Otherwise, recur down the tree
    if (value  root.value) {
        root.right = insertRec(root.right, value);
    }

    // Return the (unchanged) node pointer
    return root;
}

التصور
لفهم كيفية عمل الإدراج بشكل أفضل، دعونا نفكر في مثال. لنفترض أننا نريد إدراج التسلسل التالي من الأرقام في BST: 50، 30، 70، 20، 40، 60، 80.

50
  50
 /
30
  50
 /  \
30  70
50
 /  \
30  70
/

أدخل 40:

  50
 /  \
30  70
/ \

أدخل 60

  50
 /  \
30  70
/ \  /

أدخل 80:

  50
 /  \
30  70
/ \  / \

الكود الكامل
إليك الكود الكامل لإنشاء BST وإدراج العناصر:

public class BinarySearchTree {
    TreeNode root;

    public BinarySearchTree() {
        this.root = null;
    }

    public void insert(int value) {
        root = insertRec(root, value);
    }

    private TreeNode insertRec(TreeNode root, int value) {
        if (root == null) {
            root = new TreeNode(value);
            return root;
        }

        if (value  root.value) {
            root.right = insertRec(root.right, value);
        }

        return root;
    }

    // Additional methods for traversal, search, and delete can be added here

    public static void main(String[] args) {
        BinarySearchTree bst = new BinarySearchTree();
        int[] values = {50, 30, 70, 20, 40, 60, 80};
        for (int value : values) {
            bst.insert(value);
        }

        // Add code to print or traverse the tree
    }
}

class TreeNode {
    int value;
    TreeNode left;
    TreeNode right;

    TreeNode(int value) {
        this.value = value;
        this.left = null;
        this.right = null;
    }
}

بيان الافراج تم نشر هذه المقالة على: https://dev.to/gtgkartik/binary-search-tree-from-scratch-in-java-cbk?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3