Ən böyük BST Subtree LeetCode Həlli

Çətinlik səviyyəsi Mühit
Tez-tez soruşulur Amazon Bloomberg ByteDance Facebook microsoftBaxılıb 39

Problem bəyanat

Ən Böyük BST Alt Ağacı LeetCode Həll problemi deyir ki, ikili ağacın kökünü nəzərə alaraq, ən böyük alt ağacı tapın, bu da Binar Axtarış Ağacıdır (BST), burada ən böyük alt ağacın ən çox sayda qovşaq olduğunu bildirir.

Qeyd: Alt ağac bütün nəsillərini əhatə etməlidir.

İkili Axtarış Ağacı (BST), sol alt ağac dəyərləri onların ana qovşağının dəyərindən azdır və sağ alt ağac dəyərləri onların əsas qovşağının dəyərindən böyükdür.

Misal:

Test işi 1:

Input:

kök = [10, 8, 15, 1, 5, 7, 30, null, null, null, null, null, null, 17, 32]

Çıxış:

5

Ən Böyük BST Alt Ağacı üçün izahat:

Aşağıdakı şəkildən ən böyüyü asanlıqla öyrənə bilərik İkili axtarış ağacı indiki. Həmin Binar axtarış ağacındakı elementlərin sayı 5-dir.

Ən böyük BST Subtree LeetCode HəlliPin                                   Ən böyük BST Subtree LeetCode HəlliPin

Yanaşma

Idea:

Biz bilirik ki, ağacın sol və sağ alt ağacları Binar axtarış ağaclarıdırsa, onun etibarlı İkili axtarış ağacıdır. Beləliklə, aşağıdan yuxarıya doğru bir yanaşma izləyə bilərik. 1 qovşaqdan onun anasına keçərkən, Binar axtarış ağacının qaydalarının ana qovşaq üçün doğru olub-olmadığını müəyyən etməyə kömək edəcək bəzi məlumatları ötürə bilərik.

Əgər alt ağaclar İkili axtarış ağaclarıdırsa, əgər ana qovşağın dəyəri sol alt ağacdakı maksimum dəyərdən çox olarsa və ana qovşağın dəyəri minimum dəyərdən azdırsa, əsas qovşaqdan olan ağac İkili axtarış ağacıdır. sağ alt ağac. Beləliklə, biz 1 qovşaqdan onun ana qovşağına keçərkən bu məlumatı ötürə bilərik. İndiyə qədər maksimum BST ölçüsünü də keçə bilərik.

Beləliklə, başa düşə bilərik ki, bir qovşağı emal etməzdən əvvəl onun uşaq qovşaqlarının dəyərlərinə ehtiyacımız var. Biz bilirik Sifarişdən sonrakı keçid, uşaq qovşaqları ana qovşaqdan əvvəl işlənir. Beləliklə, müraciət etməli olduğumuzu öyrənə bilərik Sifarişdən sonrakı keçid burada.

Beləliklə, hər bir qovşaqdan bu dəyərləri onun ana qovşağına keçirəcəyik.

i) alt ağacda min node dəyəri.

ii) alt ağacda maksimum node dəyəri

iii) alt ağacda BST-nin maksimum ölçüsü

Kodu

Ən böyük BST Subtree LeetCode Həlli üçün Java Proqramı

class TreeNodeValue {
  public int maxValue, minValue, maxSize;
  TreeNodeValue(int maxValue, int minValue, int maxSize) {
    this.maxValue = maxValue;
    this.minValue = minValue;
    this.maxSize = maxSize;
  }
}
class Solution {
    public TreeNodeValue largestBSTSubtreeHelper(TreeNode root) {
      // System.out.println("Root "+root);
      if(root==null) {
        return new TreeNodeValue(Integer.MIN_VALUE, Integer.MAX_VALUE, 0);
      }
      
      TreeNodeValue leftSubtree = largestBSTSubtreeHelper(root.left);
      // System.out.println("Left"+" "+leftSubtree.minValue+" "+leftSubtree.maxValue+" "+leftSubtree.maxSize);
      TreeNodeValue rightSubtree = largestBSTSubtreeHelper(root.right);
      // System.out.println("Right"+" "+rightSubtree.minValue+" "+rightSubtree.maxValue+" "+rightSubtree.maxSize);
      
      if(leftSubtree.maxValue < root.val && rightSubtree.minValue > root.val) {
         return new TreeNodeValue(Math.max(root.val,rightSubtree.maxValue), Math.min(root.val,leftSubtree.minValue), leftSubtree.maxSize+rightSubtree.maxSize+1);
      }
      
      return new TreeNodeValue(Integer.MAX_VALUE, Integer.MIN_VALUE, Math.max(leftSubtree.maxSize,rightSubtree.maxSize));
    }
    public int largestBSTSubtree(TreeNode root) {
        return largestBSTSubtreeHelper(root).maxSize;
    }
}

Ən böyük BST Subtree LeetCode Həlli üçün C++ Proqramı

class TreeNodeValue {
public:
    int maxValue, minValue, maxSize;
    
    TreeNodeValue(int maxValue, int minValue, int maxSize) {
        this->maxValue = maxValue;
        this->minValue = minValue;
        this->maxSize = maxSize;
    }
};

class Solution {
public:
    TreeNodeValue largestBSTSubtreeHelper(TreeNode* root) {
        if (!root) {
            return TreeNodeValue(INT_MIN, INT_MAX, 0);
        }
        
        auto leftSubtree = largestBSTSubtreeHelper(root->left);
        auto rightSubtree = largestBSTSubtreeHelper(root->right);
        
      
        if (leftSubtree.maxValue < root->val && root->val < rightSubtree.minValue) {
            return TreeNodeValue(max(root->val, rightSubtree.maxValue), min(root->val, leftSubtree.minValue), 
                            leftSubtree.maxSize + rightSubtree.maxSize + 1);
        }
        
        return TreeNodeValue(INT_MAX, INT_MIN, max(leftSubtree.maxSize, rightSubtree.maxSize));
    }
    
    int largestBSTSubtree(TreeNode* root) {
        return largestBSTSubtreeHelper(root).maxSize;
    }
};

Ən böyük BST Subtree LeetCode Həlli üçün Mürəkkəblik Təhlili

Zamanın mürəkkəbliyi

Burada hər qovşağı yalnız bir dəfə ziyarət edirik. Beləliklə, zamanın mürəkkəbliyi O (n), burada n ağacdakı qovşaq sayıdır.

Kosmik Mürəkkəblik

The rekursiya yığın alır O (H) boşluq, burada H ağacın hündürlüyüdür. Ən pis halda, H = n. Beləliklə, kosmik mürəkkəblik O (n).

Referans: https://en.wikipedia.org/wiki/Binary_search_tree

https://en.wiktionary.org/wiki/subtree

 

 

 

 

 

 

 

Şərh yaz

Translate »