İkili Axtarış Ağacı Leetcode həllində axtarın

Çətinlik səviyyəsi Asan
Tez-tez soruşulur alma IBM
alqoritmlər İkili Axtarış Ağacı kodlaşdırma müsahibə müsahibə hazırlığı LeetCode LeetCodeSolutionsBaxılıb 84

Sistem dizaynı ilə bağlı müsahibə sualları o qədər açıq ola bilər ki, düzgün hazırlaşmağı bilmək çox çətindir. İndi satın aldıqdan sonra Amazon, Microsoft və Adobe-nin dizayn dövrlərini sındıra bilirəm Bu kitabı. Gündəlik bir yenidən nəzərdən keçirin dizayn sualı və söz verirəm ki, dizayn dövrünü sındıra bilərsiniz.

Bu problemdə bizə İkili Axtarış Ağacı və tam ədədi. Verilən tam ilə eyni dəyəri olan bir qovşaq ünvanını tapmaq lazımdır. Bir çek olaraq, bu düyünü kök olaraq alan alt ağacın ön sifariş keçidini yazdırmalıyıq. Ağacda verilən tamlıqla eyni dəyər yoxdursa, qayıtmalıyıq NULLyəni boş bir ağac.

misal

     2
    
  /     \

1         3

             \

               4


Target Value = 3
3 4
     5

  /      \

1         10 


Target Value = 4
Empty BST

İzahat # 1

BST, dəyəri 3 olan bir qovşaq ehtiva edir, buna görə alt ağacını qaytarırıq və əvvəlcədən sifariş keçidini çap edirik.

İzahat # 2

BST-də dəyəri 4 olan hər hansı bir qovşaq yoxdur, buna görə NULL qaytarırıq və “Boş BST” yazırıq.

Yanaşma (rekursiv)

Bu vəziyyətdə bir problemin alt problemdən necə asılı olduğunu düşünək. Deyək ki, funksiyamız tapılsa, hədəf dəyəri olan qovşaq adresini qaytarır. Ağacın kökündən başlayırıq. Bu qovşaq varsa SIFIR, ikili axtarış ağacının sonuna çatdığımız açıqdır və bu səbəbdən hədəf dəyəri olan bir qovşaq yoxdur. Beləliklə, geri qayıdırıq SIFIR. Eynilə, biz düyün dəyəri hədəf dəyərinə bərabərik, bu nodu qaytarırıq. Əks təqdirdə, hədəfə dəyər verilən düyünün ya içində olacağını bilirik Zaman subtree və ya sağ cari kökün alt ağacı. Root.value və hədəf dəyərini müqayisə edərək istiqamətə (sola və ya sağa) qərar verə bilərik. Beləliklə, eyni rekursiv funksiyanı kök as kök. sol or kök. hüququ.

İkili Axtarış Ağacı Leetcode həllində axtarınPin

Alqoritm

  1. Bir funksiya yaradın searchBST () hədəf ünvanı qayıtmaq üçün
  2. If kök bərabərdir null OR kök hədəfin dəyəri ilə eyni dəyərə malikdir:
    • Kökə qayıdın
  3. Root.value hədəf dəyərindən böyükdürsə:
    1. qayıtmaq searchBST (root.left, val)
  4. Qayıtmaq searchBST (root.right, val)
  5. Hədəf nodunun əvvəlcədən sifarişini çap edin

İkili Axtarış Ağacı Leetcode həllində axtarışın həyata keçirilməsi

C ++ Proqramı

#include <bits/stdc++.h>
using namespace std;

struct BSTNode
{
    int value;
    BSTNode *left , *right;
    BSTNode(int val)
    {
        value = val;
        left = right = NULL;
    }
};

void preorderTraversal(BSTNode* root)
{
    if(root == NULL)
        return;
    cout << root->value << " ";
    preorderTraversal(root->left);
    preorderTraversal(root->right);
    return;
}

BSTNode* searchBST(BSTNode* root , int val)
{
    if(root == NULL)
        return root;
    if(val == root->value)
        return root;
    if(val < root->value)
        return searchBST(root->left , val);
    return searchBST(root->right , val);
}

int main()
{
    BSTNode* root = new BSTNode(2);
    root->left = new BSTNode(1);
    root->right = new BSTNode(3);
    root->right->right = new BSTNode(4);
    int val = 3;
    BSTNode* targetNode = searchBST(root , val);
    if(targetNode == NULL)
    {
        cout << "Empty Tree" << '\n';
        return 0;
    }
    preorderTraversal(targetNode);
    return 0;
}

Java Proqramı

class BSTNode
{
    int value;
    BSTNode left , right;
    BSTNode(int val)
    {
        value = val;
        left = right = null;
    }
}

class search_in_BST
{
    public static void main(String args[])
    {
        BSTNode root = new BSTNode(2);
        root.left = new BSTNode(1);
        root.right = new BSTNode(3);
        root.right.right = new BSTNode(4);
        int val = 3;
        BSTNode targetNode = searchBST(root , val);
        if(targetNode == null)
        {
            System.out.println("Empty Tree");
            System.exit(0);
        }
        preorderTraversal(targetNode);
    }

    static BSTNode searchBST(BSTNode root , int val)
    {
        if(root == null)
            return root;
        if(val == root.value)
            return root;
        if(val < root.value)
            return searchBST(root.left , val);
        return searchBST(root.right , val);
    }

    static void preorderTraversal(BSTNode root)
    {
        if(root == null)
            return;
        System.out.print(root.value + " ");
        preorderTraversal(root.left);
        preorderTraversal(root.right);
        return;
    }
}
3 4

İkili Axtarış Ağacı Leetcode həllində axtarışın mürəkkəbliyinin təhlili

Zamanın mürəkkəbliyi

O (H), H = logN = Orta hallarda BST yüksəkliyi və O (N), N = ən pis vəziyyətdə BST ölçüsü. BST əyri olduqda baş verən ən pis vəziyyətdə ağacdan bir dəfə keçirik.

Kosmik mürəkkəblik

O (H) ortalama hallarda, hər nodu keçmək üçün rekursiv çağırışlardan istifadə edirik. O (N) ən pis halda. Vacib bir qeyd bəzi tərtibçilərin təmin etməsidir quyruq rekursiyası və bu hallarda kosmik mürəkkəblik olur O (1).

Yanaşma (təkrarlayıcı)

Yuxarıda göstərilən yanaşmaya bənzər olaraq, cari qovşaqda hədəf dəyəri yoxdursa, sola və ya sağ alt ağacdan tullana bilərik, bunu təyin edərək təkrarlaya bilərik kök = kök.sol or kök = kök.sağ kök çevrilənə qədər hər təkrarda sıfır. Kök dəyərinin istənilən təkrarlanmada hədəf dəyərinə bərabər olduğunu tapsaq, həmin kökü qaytarırıq. Əks təqdirdə geri qayıdırıq sıfır.

Alqoritm

  1. Bənzər bir funksiya yaradın searchBST () hədəf node adresini qaytaran
  2. Isə kök is yox sıfır:
    • if kök. dəyər hədəf dəyərinə bərabərdir
      • qayıtmaq kök
    • if kök.val is böyük hədəf dəyərindən daha çox
      • Sağ alt ağaca keçin: kök = kök.sağ
    • daha
      • Sol alt ağaca keçin: kök = kök.sol
  3. Qayıtmaq null
  4. Hədəf nodunun əvvəlcədən sifarişini çap edin

İkili Axtarış Ağacı Leetcode həllində axtarışın həyata keçirilməsi

C ++ Proqramı

#include <bits/stdc++.h>
using namespace std;

struct BSTNode
{
    int value;
    BSTNode *left , *right;
    BSTNode(int val)
    {
        value = val;
        left = right = NULL;
    }
};

void preorderTraversal(BSTNode* root)
{
    if(root == NULL)
        return;
    cout << root->value << " ";
    preorderTraversal(root->left);
    preorderTraversal(root->right);
    return;
}

BSTNode* searchBST(BSTNode* root , int val)
{
    while(root != NULL)
    {
        if(root->value == val)
            return root;
        if(root->value > val)
            root = root->left;
        else
            root = root->right;
    }
    return NULL;
}

int main()
{
    BSTNode* root = new BSTNode(2);
    root->left = new BSTNode(1);
    root->right = new BSTNode(3);
    root->right->right = new BSTNode(4);
    int val = 3;
    BSTNode* targetNode = searchBST(root , val);
    if(targetNode == NULL)
    {
        cout << "Empty Tree" << '\n';
        return 0;
    }
    preorderTraversal(targetNode);
    return 0;
}

Java Proqramı

class BSTNode
{
    int value;
    BSTNode left , right;
    BSTNode(int val)
    {
        value = val;
        left = right = null;
    }
}

class search_in_BST
{
    public static void main(String args[])
    {
        BSTNode root = new BSTNode(2);
        root.left = new BSTNode(1);
        root.right = new BSTNode(3);
        root.right.right = new BSTNode(4);
        int val = 3;
        BSTNode targetNode = searchBST(root , val);
        if(targetNode == null)
        {
            System.out.println("Empty Tree");
            System.exit(0);
        }
        preorderTraversal(targetNode);
    }

    static BSTNode searchBST(BSTNode root , int val)
    {
        while(root != null)
        {
            if(root.value == val)
                return root;
            if(root.value > val)
                root = root.left;
            else
                root = root.right;
        }
        return null;
    }

    static void preorderTraversal(BSTNode root)
    {
        if(root == null)
            return;
        System.out.print(root.value + " ");
        preorderTraversal(root.left);
        preorderTraversal(root.right);
        return;
    }
}
3 4

İkili Axtarış Ağacı Leetcode həllində axtarışın mürəkkəbliyinin təhlili

Zamanın mürəkkəbliyi

O (H = logN) orta hallarda və O (N) ən pis hallarda (əyri BST), yuxarıdakı yanaşma ilə eyni.

Kosmik mürəkkəblik

O (1) yalnız daimi yaddaş məkanından istifadə etdiyimiz üçün.

Crack Sistemi Dizayn Müsahibələri
Translate »
1