Nasıl bir ikili arama ağacı doğrularım?

oy
54

Ben bir ikili arama ağacı doğrulayarak olarak bilinen röportajlarda burada egzersizin okumaya devam edin.

Bu tam olarak nasıl çalışıyor? Ya biri bir ikili arama ağacı doğrulanırken arıyor ki? Ben temel arama ağacı yazılı, ancak bu kavramın hiç duymadım.

Oluştur 01/02/2009 saat 02:41
kaynak kullanıcı
Diğer dillerde...                            


30 cevaplar

oy
13

"Doğrulama" bir ikili arama ağacı bunu gerçekten sağda solda ve büyük öğeler üzerinde tüm küçük öğeler var olduğunu kontrol anlamına gelir. Esasen, bir ikili ağaç bir ikili olup olmadığını görmek için bir çek arama ağacı.

Cevap 01/02/2009 saat 02:44
kaynak kullanıcı

oy
106

Aslında bu hata herkes bir röportajda yapmasıdır.

göre kontrol edilmelidir Leftchild (minLimitof düğümü node.value)

Rightchild göre kontrol edilmelidir (node.value, düğümün MaxLimit)

IsValidBST(root,-infinity,infinity);

bool IsValidBST(BinaryNode node, int MIN, int MAX) 
{
     if(node == null)
         return true;
     if(node.element > MIN 
         && node.element < MAX
         && IsValidBST(node.left,MIN,node.element)
         && IsValidBST(node.right,node.element,MAX))
         return true;
     else 
         return false;
}

Bir diğer çözüm, (boşluk bir kısıtlama değilse): ağacının bir olgusudur geçişi fazlası ve bir dizi içinde duğum değerlerini depolar. Dizi aksi halde sıralanmış sırayla onun geçerli bir BST değilse.

Cevap 17/04/2009 saat 11:11
kaynak kullanıcı

oy
5

İşte Clojure benim çözümdür:

(defstruct BST :val :left :right)

(defn in-order [bst]
  (when-let [{:keys [val, left, right]} bst]
    (lazy-seq
      (concat (in-order left) (list val) (in-order right)))))

(defn is-strictly-sorted? [col]
  (every?
    (fn `a b` (< a  b))
    (partition 2 1 col)))

(defn is-valid-BST [bst]
  (is-strictly-sorted? (in-order bst)))
Cevap 08/01/2010 saat 08:30
kaynak kullanıcı

oy
1

"İlk bir değişmeyen tanımlamak daha iyidir İşte değişmez olduğu -. Içinde sipariş kastetmek BST herhangi iki ardışık elemanlar kesinlikle onların görünüm sırasını artan olmalıdır (eşit olamaz her zaman sırayla artan geçişi). Yani çözüm '<' (veya '>') bir tane ziyaret son ziyaret nodu ve karşılaştırmayı son karşı akım düğümü hatırlayarak ile sadece basit de sipariş geçişi olabilir."

Cevap 30/03/2010 saat 09:07
kaynak kullanıcı

oy
7

geçişi olgusudur kullanılarak iteratif çözelti.

bool is_bst(Node *root) {
  if (!root)
    return true;

  std::stack<Node*> stack;
  bool started = false;
  Node *node = root;
  int prev_val;

  while(true) {
    if (node) {
      stack.push(node);
      node = node->left();
      continue;
    }
    if (stack.empty())
      break;
    node = stack.top();
    stack.pop();

    /* beginning of bst check */
    if(!started) {
      prev_val = node->val();
      started = true;
    } else {
      if (prev_val > node->val())
        return false;
      prev_val = node->val();
    }
    /* end of bst check */

    node = node->right();
  }
  return true;
}
Cevap 29/04/2011 saat 22:35
kaynak kullanıcı

oy
0

Yinelemeli çözüm:

isBinary(root)
    {
        if root == null 
          return true
       else if( root.left == NULL and root.right == NULL)
          return true
       else if(root.left == NULL)
           if(root.right.element > root.element)
               rerturn isBInary(root.right)
        else if (root.left.element < root.element)
              return isBinary(root.left)
        else
              return isBInary(root.left) and isBinary(root.right)

    }
Cevap 05/09/2011 saat 16:36
kaynak kullanıcı

oy
1
bool BinarySearchTree::validate() {
    int minVal = -1;
    int maxVal = -1;
    return ValidateImpl(root, minVal, maxVal);
}

bool BinarySearchTree::ValidateImpl(Node *currRoot, int &minVal, int &maxVal)
{
    int leftMin = -1;
    int leftMax = -1;
    int rightMin = -1;
    int rightMax = -1;

    if (currRoot == NULL) return true;

    if (currRoot->left) {
        if (currRoot->left->value < currRoot->value) {
            if (!ValidateImpl(currRoot->left, leftMin, leftMax)) return false;
            if (leftMax != currRoot->left->value && currRoot->value < leftMax)  return false;
        }
        else
            return false;
    } else {
        leftMin = leftMax = currRoot->value;
    }

    if (currRoot->right) {
        if (currRoot->right->value > currRoot->value) {
            if(!ValidateImpl(currRoot->right, rightMin, rightMax)) return false;
            if (rightMin != currRoot->right->value && currRoot->value > rightMin)  return false;
        }
        else return false;
    } else {
        rightMin = rightMax = currRoot->value;
    }

    minVal = leftMin < rightMin ? leftMin : rightMin;
    maxVal = leftMax > rightMax ? leftMax : rightMax;

    return true;
}
Cevap 13/02/2012 saat 21:08
kaynak kullanıcı

oy
0
// using inorder traverse based Impl
bool BinarySearchTree::validate() {
    int val = -1;
    return ValidateImpl(root, val);
}

// inorder traverse based Impl
bool BinarySearchTree::ValidateImpl(Node *currRoot, int &val) {
    if (currRoot == NULL) return true;

    if (currRoot->left) {
        if (currRoot->left->value > currRoot->value) return false;
        if(!ValidateImpl(currRoot->left, val)) return false;
    }

    if (val > currRoot->value) return false;
    val = currRoot->value;

    if (currRoot->right) {
        if (currRoot->right->value < currRoot->value) return false;
        if(!ValidateImpl(currRoot->right, val)) return false;
    }
    return true;
}
Cevap 14/02/2012 saat 10:34
kaynak kullanıcı

oy
-3
boolean isBST(Node root) {
    if (root == null) { return true; }
    return (isBST(root.left) && (isBST(root.right) && (root.left == null || root.left.data <= root.data) && (root.right == null || root.right.data > root.data));
}
Cevap 05/03/2012 saat 23:45
kaynak kullanıcı

oy
-1

İşte ekstra alan kullanmadan iteratif bir çözümdür.

Node{
     int value;
     Node right, left
  }

  public boolean ValidateBST(Node root){
    Node currNode = root;
    Node prevNode = null;
    Stack<Node> stack = new Stack<Node>();
    while(true){
        if(currNode != null){
            stack.push(currNode);
            currNode = currNode.left;
            continue;
        }
        if(stack.empty()){
            return;
        }
        currNode = stack.pop();
        if(prevNode != null){
            if(currNode.value < prevNode.value){
                return false;
            }
        }
        prevNode = currNode;
        currNode = currNode.right;
    }
}
Cevap 07/04/2012 saat 02:07
kaynak kullanıcı

oy
1
bool ValidateBST(Node *pCurrentNode, int nMin = INT_MIN, int nMax = INT_MAX)
{
    return
    (
        pCurrentNode == NULL
    )
    ||
    (
        (
            !pCurrentNode->pLeftNode ||
            (
                pCurrentNode->pLeftNode->value < pCurrentNode->value &&
                pCurrentNode->pLeftNode->value < nMax &&
                ValidateBST(pCurrentNode->pLeftNode, nMin, pCurrentNode->value)
            )
        )
        &&
        (
            !pCurrentNode->pRightNode ||
            (
                pCurrentNode->pRightNode->value > pCurrentNode->value &&
                pCurrentNode->pRightNode->value > nMin &&
                ValidateBST(pCurrentNode->pRightNode, pCurrentNode->value, nMax)
            )
        )
    );
}
Cevap 20/05/2012 saat 03:33
kaynak kullanıcı

oy
12

Bulduğum en iyi çözüm O (n) 'dir ve hiçbir ekstra alan kullanır. Bu inorder kastetmek benzer ama bunun yerine bir statik değişkeni alıp kontrol edebilirsiniz sıralanır olmadığını kontrol ardından diziye depolamak ve dizisi sıralanır olmadığını geçme inorder iken.

static struct node *prev = NULL;

bool isBST(struct node* root)
{
    // traverse the tree in inorder fashion and keep track of prev node
    if (root)
    {
        if (!isBST(root->left))
          return false;

        // Allows only distinct valued nodes
        if (prev != NULL && root->data <= prev->data)
          return false;

        prev = root;

        return isBST(root->right);
    }

    return true;
}
Cevap 06/06/2012 saat 08:14
kaynak kullanıcı

oy
0

Verilen BT herhangi veri türü için BST olup olmadığını öğrenmek için, aşağıda yaklaşımla gitmek gerekir. kastetmek 2. inorder kullanarak yaprak düğümün sonuna kadar 1. Çağrı özyinelemeli işlevi min kurmak ve maksimum Kendini değer verir.

Ağaç elementi operatörü belirtilenden daha büyük / daha az olması gerekir.

#define MIN (FirstVal, SecondVal) ((FirstVal) < (SecondVal)) ? (FirstVal):(SecondVal)
#define MAX (FirstVal, SecondVal) ((FirstVal) > (SecondVal)) ? (FirstVal):(SecondVal)

template <class T>
bool IsValidBST (treeNode &root)
{

   T min,  max;
   return IsValidBST (root, &min, &max);
}

template <class T>
bool IsValidBST (treeNode *root, T *MIN , T *MAX)
{
   T leftMin, leftMax, rightMin, rightMax;
   bool isValidBST;

   if (root->leftNode == NULL && root->rightNode == NULL)
   {
      *MIN = root->element;
      *MAX = root->element;
      return true;
   }

  isValidBST = IsValidBST (root->leftNode, &leftMin, &leftMax);

  if (isValidBST)
    isValidBST = IsValidBST (root->rightNode, &rightMin, &rightMax);

  if (isValidBST)
  {
     *MIN = MIN (leftMIN, rightMIN);
     *Max = MAX (rightMax, leftMax);
  }

  return isValidBST;
}
Cevap 13/06/2012 saat 18:16
kaynak kullanıcı

oy
0
bool isBST(struct node* root)
{
    static struct node *prev = NULL;
    // traverse the tree in inorder fashion and keep track of prev node
    if (root)
    {
        if (!isBST(root->left))
            return false;
        // Allows only distinct valued nodes
        if (prev != NULL && root->data <= prev->data)
            return false;
        prev = root;
        return isBST(root->right);
    }
    return true;
}

İyi çalışıyor :)

Cevap 28/06/2012 saat 11:24
kaynak kullanıcı

oy
0

Özyineleme kolaydır ama tekrarlanan bir yaklaşım iyidir, orada bir iteratif versiyonu yukarıda ama yol çok karmaşık gerekenden daha var. İşte en iyi çözüm c++Eğer herhangi bir yere bulacaksınız:

Bu algoritma çalışır O(N)zaman ve ihtiyacı O(lgN)alanı.

struct TreeNode
{
    int value;
    TreeNode* left;
    TreeNode* right;
};

bool isBST(TreeNode* root) {
    vector<TreeNode*> stack;
    TreeNode* prev = nullptr;
    while (root || stack.size()) {
        if (root) {
           stack.push_back(root);
           root = root->left;
        } else {
            if (prev && stack.back()->value <= prev->value)
                return false;
            prev = stack.back();
            root = prev->right;                    
            stack.pop_back();
        }
    }
    return true;
}
Cevap 04/11/2012 saat 07:20
kaynak kullanıcı

oy
0

Ben Geçiş BST inorder kullanmak ve düğümleri alanı için sipariş artmaktadır olmadığını kontrol etmek için bir çözüm yazdım O(1)VE zamanda O(n). TreeNode predecessordüğümü önceki edilir. Ben çözüm doğru ya da değil emin değilim. Cihazın gücünü Çünkü Geçişi bir bütün ağaç tanımlayamazsınız.

public boolean isValidBST(TreeNode root, TreeNode predecessor) {
    boolean left = true, right = true;
    if (root.left != null) {
        left = isValidBST(root.left, predecessor);
    }
    if (!left)
        return false;

    if (predecessor.val > root.val)
        return false;

    predecessor.val = root.val;
    if (root.right != null) {
        right = isValidBST(root.right, predecessor);
    }

    if (!right)
        return false;

    return true;

}
Cevap 16/02/2013 saat 03:25
kaynak kullanıcı

oy
0

Biz ağaç içinde sipariş DFS seyahat BST doğrulama Java uygulaması, aşağıda ve son sayısından daha büyük herhangi bir sayıda alırsanız yanlış döndürür.

static class BSTValidator {
  private boolean lastNumberInitialized = false;
  private int lastNumber = -1;

  boolean isValidBST(TreeNode node) {
    if (node.left != null && !isValidBST(node.left)) return false;

    // In-order visiting should never see number less than previous
    // in valid BST.
    if (lastNumberInitialized && (lastNumber > node.getData())) return false;
    if (!lastNumberInitialized) lastNumberInitialized = true;

    lastNumber = node.getData();

    if (node.right != null && !isValidBST(node.right)) return false;

    return true;
  }
}
Cevap 18/01/2014 saat 06:58
kaynak kullanıcı

oy
3

Bir BST içinde sipariş geçişi olmayan bir azalma dizisi olduğu için, bir ikili ağaç BST olup olmadığını yargılamak için bu özelliği kullanabilirsiniz. Kullanma Morris geçişi ve muhafaza predüğümü, biz bir çözüm alabilir O (n) zaman ve O (1) alan karmaşıklığı. İşte benim kodudur

public boolean isValidBST(TreeNode root) {
    TreeNode pre = null, cur = root, tmp;
    while(cur != null) {
        if(cur.left == null) {
            if(pre != null && pre.val >= cur.val) 
                return false;
            pre = cur;
            cur = cur.right;
        }
        else {
            tmp = cur.left;
            while(tmp.right != null && tmp.right != cur)
                tmp = tmp.right;
            if(tmp.right == null) { // left child has not been visited
                tmp.right = cur;
                cur = cur.left;
            }
            else { // left child has been visited already
                tmp.right = null;
                if(pre != null && pre.val >= cur.val) 
                    return false;
                pre = cur;
                cur = cur.right;
            }
        }
    }
    return true;
}
Cevap 18/10/2014 saat 20:13
kaynak kullanıcı

oy
1

Geçenlerde bir telefon röportajında ​​bu soruya var ve daha gerekenden daha onunla mücadele etti. Ben çocuk bezlerinde minimum ve maksimum değerleri takip etmek için çalışıyordu ve ben sadece bir röportajda baskısı altında farklı durumlarda beynimi sarmak olamazdı.

düşen ederken uykuda geçen gece bunu düşündüm sonra, bunun bir inorder çevirmesi esnasında ziyaret ettik son düğümün takip kadar basit olduğunu fark etti. Java'da:

public <T extends Comparable<T>> boolean isBst(TreeNode<T> root) {
    return isBst(root, null);
}

private <T extends Comparable<T>> boolean isBst(TreeNode<T> node, TreeNode<T> prev) {
    if (node == null)
        return true;

    if (isBst(node.left, prev) && (prev == null || prev.compareTo(node) < 0 ))
        return isBst(node.right, node);

    return false;
}
Cevap 10/12/2014 saat 05:21
kaynak kullanıcı

oy
0

İteratif çözüm.

private static boolean checkBst(bst node) {

    Stack<bst> s = new Stack<bst>();
    bst temp;
    while(node!=null){
        s.push(node);
        node=node.left;
    }
    while (!s.isEmpty()){
        node = s.pop();
        System.out.println(node.val);
        temp = node;
        if(node.right!=null){
            node = node.right;
            while(node!=null)
            {
                //Checking if the current value is lesser than the previous value and ancestor.
                if(node.val < temp.val)
                    return false;
                if(!s.isEmpty())
                    if(node.val>s.peek().val)
                        return false;
                s.push(node);
                if(node!=null)
                node=node.left;
            }
        }
    }
    return true;
}
Cevap 15/12/2014 saat 14:44
kaynak kullanıcı

oy
0

Bu kopyaların için çalışır.

// time O(n), space O(logn)
// pseudocode
is-bst(node, min = int.min, max = int.max):
    if node == null:
        return true
    if node.value <= min || max < node.value:
        return false
    return is-bst(node.left, min, node.value)
        && is-bst(node.right, node.value, max)

Bu için bile çalışır int.minve int.maxkullanan değerler Nullabletürlerini.

// time O(n), space O(logn)
// pseudocode
is-bst(node, min = null, max = null):
    if node == null:
        return true
    if min != null && node.value <= min
        return false
    if max != null && max < node.value:
        return false
    return is-bst(node.left, min, node.value)
        && is-bst(node.right, node.value, max)
Cevap 25/03/2015 saat 08:16
kaynak kullanıcı

oy
0

Esinlenerek http://www.jiuzhang.com/solutions/validate-binary-search-tree/

kastetmek ve bölmek && fethet: iki genel çözümü vardır.

public class validateBinarySearchTree {
    public boolean isValidBST(TreeNode root) {
        return isBSTTraversal(root) && isBSTDivideAndConquer(root);
    }

    // Solution 1: Traversal
    // The inorder sequence of a BST is a sorted ascending list
    private int lastValue = 0; // the init value of it doesn't matter.
    private boolean firstNode = true;
    public boolean isBSTTraversal(TreeNode root) {
        if (root == null) {
            return true;
        }

        if (!isValidBST(root.left)) {
            return false;
        }

        // firstNode is needed because of if firstNode is Integer.MIN_VALUE,
        // even if we set lastValue to Integer.MIN_VALUE, it will still return false
        if (!firstNode && lastValue >= root.val) {
            return false;
        }

        firstNode = false;
        lastValue = root.val;

        if (!isValidBST(root.right)) {
            return false;
        }

        return true;

    }

    // Solution 2: divide && conquer
    private class Result {
        int min;
        int max;
        boolean isBST;
        Result(int min, int max, boolean isBST) {
            this.min = min;
            this.max = max;
            this.isBST = isBST;
        }
    }

    public boolean isBSTDivideAndConquer(TreeNode root) {
        return isBSTHelper(root).isBST;
    }

    public Result isBSTHelper(TreeNode root) {
        // For leaf node's left or right
        if (root == null) {
            // we set min to Integer.MAX_VALUE and max to Integer.MIN_VALUE
            // because of in the previous level which is the leaf level,
            // we want to set the min or max to that leaf node's val (in the last return line)
            return new Result(Integer.MAX_VALUE, Integer.MIN_VALUE, true);
        }

        Result left = isBSTHelper(root.left);
        Result right = isBSTHelper(root.right);

        if (!left.isBST || !right.isBST) {
            return new Result(0,0, false);
        }

        // For non-leaf node
        if (root.left != null && left.max >= root.val
                && root.right != null && right.min <= root.val) {
            return new Result(0, 0, false);
        }

        return new Result(Math.min(left.min, root.val),
                Math.max(right.max, root.val), true);
    }
}
Cevap 07/10/2015 saat 05:24
kaynak kullanıcı

oy
-3

İşte benim özyinelemeli çözüm JavaScript ile yazılmış

function isBST(tree) {
  if (tree === null) return true;

  if (tree.left != undefined && tree.left.value > tree.value) {
    return false;
  }

  if (tree.right != undefined && tree.right.value <= tree.value) {
    return false;
  }

  return isBST(tree.left) && isBST(tree.right);
}
Cevap 19/10/2015 saat 03:29
kaynak kullanıcı

oy
1

Java ve ya alt ağacında aynı değere sahip sağlayan düğümler olarak:

public boolean isValid(Node node) {
    return isValid(node, Integer.MIN_VALUE, Integer.MAX_VALUE);
}

private boolean isValid(Node node, int minLimit, int maxLimit) {
    if (node == null)
        return true;
    return minLimit <= node.value && node.value <= maxLimit
            && isValid(node.left, minLimit, node.value)
            && isValid(node.right, node.value, maxLimit);
}
Cevap 10/09/2016 saat 05:03
kaynak kullanıcı

oy
-1
 private void validateBinarySearchTree(Node node) {
    if (node == null) return;

    Node left = node.getLeft();
    if (left != null) {
        if (left.getData() < node.getData()) {
            validateBinarySearchTree(left);
        } else {
            throw new IllegalStateException("Not a valid Binary Search tree");
        }
    }

    Node right = node.getRight();
    if (right != null) {
        if (right.getData() > node.getData()) {
            validateBinarySearchTree(right);
        } else {
            throw new IllegalStateException("Not a valid Binary Search tree");
        }
    }
}
Cevap 20/11/2017 saat 20:30
kaynak kullanıcı

oy
2

İşte python cevabım ise, tüm köşe durumlarda ele alır ve iyi test hackerrank web

""" Node is defined as
class node:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None
"""

def checkBST(root):
    return checkLeftSubTree(root, root.left) and checkRightSubTree(root, root.right)

def checkLeftSubTree(root, subTree):
    if not subTree:
        return True
    else:
        return root.data > subTree.data \
        and checkLeftSubTree(root, subTree.left) \ 
        and checkLeftSubTree(root, subTree.right) \
        and checkLeftSubTree(subTree, subTree.left) \
        and checkRightSubTree(subTree, subTree.right)

def checkRightSubTree(root, subTree):
    if not subTree:
        return True
    else:
        return root.data < subTree.data \ 
        and checkRightSubTree(root, subTree.left) \
        and checkRightSubTree(root, subTree.right) \
        and checkRightSubTree(subTree, subTree.right) \
        and checkLeftSubTree(subTree, subTree.left)
Cevap 26/12/2017 saat 18:04
kaynak kullanıcı

oy
0

Bir astar

bool is_bst(Node *root, int from, int to) {
   return (root == NULL) ? true :
     root->val >= from && root->val <= to &&
     is_bst(root->left, from, root->val) &&
     is_bst(root->right, root->val, to);
}

Oldukça uzun çizgi gerçi.

Cevap 15/01/2018 saat 19:12
kaynak kullanıcı

oy
0

İşte Sedgewick'e algoritması sınıfından java bir çözümdür. Tam BST uygulamasını kontrol buraya

Bazı açıklayıcı yorum ekledi

private boolean isBST() {
    return isBST(root, null, null);

}

private boolean isBST(Node x, Key min, Key max) {
    if (x == null) return true;
    // when checking right subtree min is key of x's parent
    if (min != null && x.key.compareTo(min) <= 0) return false;
    // when checking left subtree, max is key of x's parent
    if (max != null && x.key.compareTo(max) >= 0) return false;
    // check left subtree and right subtree
    return isBST(x.left, min, x.key) && isBST(x.right, x.key, max);

}
Cevap 30/10/2018 saat 23:02
kaynak kullanıcı

oy
0
  • iterativeFonksiyon verilen ağaç bir ikili arama ağacı iteratif olmadığını kontrol eder.
  • recurseFonksiyon verilen ağaç bir ikili arama ağacı olup olmadığını yinelemeli olmadığını kontrol eder.
  • In iterativefonksiyonu Ben BST kontrol etmek için bfs kullanın.
  • In recursefonksiyonu Ben BST kontrol etmek için DFS kullanın.
  • Her iki çözüm de bir zaman karmaşıklık var O(n)
  • iterativeSolüsyon üzerinde bir avantaja sahiptir recurseçözüm ve olmasıdır iterativeçözüm erken durdurmayı yapar.
  • Hatta recursefonksiyon küresel bayrak değeri ile erken durdurma için optimize edilebilir.
  • Her iki çözüm fikri sol alt kök düğüm whihch üst düğümün değerine -Infinity aralığında olmasıdır
  • Sağ alt kök düğüm whihch üst düğümün değerine + sonsuz aralığında olmalıdır
  • Ve aralığında geçerli düğümün değerini karşılaştırarak devam ederler. Herhangi düğümün değeri aralığında değilse False döndürür

    class Solution:
        def isValidBST(self, root):
            """
            :type root: TreeNode
            :rtype: bool
            """
            return self.iterative(root)
            # return self.recurse(root, float("inf"), float("-inf"))
    
        def iterative(self, root):
            if not root:
                return True
    
            level = [[root, -float("inf"), float("inf")]]
    
            while level:
                next_level = []
    
                for element in level:
                    node, min_val, max_val = element
                    if min_val<node.val<max_val:
                        if node.left:
                            next_level.append([node.left, min_val, node.val])
                        if node.right:
                            next_level.append([node.right, node.val, max_val])
                    else:
                        return False
                level = next_level
    
            return True
    
        def recurse(self, root, maxi, mini):
            if root is None:
                return True
    
            if root.val < mini or root.val > maxi:
                return False
    
            return self.recurse(root.left, root.val-1, mini) and self.recurse(root.right, maxi, root.val+1)
    
Cevap 01/11/2018 saat 03:22
kaynak kullanıcı

oy
0

Python uygulama örneği. Bu örnek, açıklamaları tip kullanmaktadır. Düğüm sınıfı kendisini kullanan Ancak beri modülün bir ilk satırı olarak dahil etmek gerekir:

from __future__ import annotations

Aksi takdirde, alacak name 'Node' is not definedhatası. Bu örnek, aynı zamanda, örnek olarak dataclass kullanır. O sol ve sağ düğümleri değerlerin kontrolü için yineleme kullandığında BST olmadığını kontrol etmek için.

"""Checks if Binary Search Tree (BST) is balanced"""

from __future__ import annotations
import sys
from dataclasses import dataclass

MAX_KEY = sys.maxsize
MIN_KEY = -sys.maxsize - 1


@dataclass
class Node:
    value: int
    left: Node
    right: Node

    @property
    def is_leaf(self) -> bool:
        """Check if node is a leaf"""
        return not self.left and not self.right


def is_bst(node: Node, min_value: int, max_value: int) -> bool:
    if node.value < min_value or max_value < node.value:
        return False
    elif node.is_leaf:
        return True

    return is_bst(node.left, min_value, node.value) and is_bst(
        node.right, node.value, max_value
    )


if __name__ == "__main__":
    node5 = Node(5, None, None)
    node25 = Node(25, None, None)
    node40 = Node(40, None, None)
    node10 = Node(10, None, None)

    # balanced tree
    node30 = Node(30, node25, node40)
    root = Node(20, node10, node30)
    print(is_bst(root, MIN_KEY, MAX_KEY))

    # unbalanced tree
    node30 = Node(30, node5, node40)
    root = Node(20, node10, node30)
    print(is_bst(root, MIN_KEY, MAX_KEY))
Cevap 16/01/2019 saat 00:10
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more