Comment valider un arbre de recherche binaire?

voix
54

Je lis ici d'un exercice dans les entretiens connus comme la validation d'un arbre de recherche binaire.

Comment est-ce que cela fonctionne exactement? Que peut-on rechercher dans la validation d'un arbre de recherche binaire? Je l'ai écrit un arbre de recherche de base, mais jamais entendu parler de ce concept.

Créé 01/02/2009 à 02:41
source utilisateur
Dans d'autres langues...                            


30 réponses

voix
13

« Valider » un arbre de recherche binaire signifie que vous vérifiez qu'il a bel et bien tous les petits objets sur les éléments gauche et grands sur la droite. Pour l' essentiel, il est un chèque pour voir si un arbre binaire est un binaire de recherche arbre.

Créé 01/02/2009 à 02:44
source utilisateur

voix
106

En fait, c'est, tout le monde erreur fait dans une interview.

Leftchild doit être vérifiée par rapport (noeud minLimitof, node.value)

Rightchild doit être vérifiée par rapport à (node.value, MaxLimit de noeud)

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;
}

Une autre solution (si l'espace est pas une contrainte): Est-ce un parcours infixe de l'arbre et de stocker les valeurs de nœud dans un tableau. Si le tableau est en ordre de tri, est un BST valide par ailleurs pas.

Créé 17/04/2009 à 11:11
source utilisateur

voix
5

Voici ma solution dans Clojure:

(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)))
Créé 08/01/2010 à 08:30
source utilisateur

voix
1

« Il est préférable de définir un invariant premier ici l'invariant est -. Deux éléments successifs du BST dans le en ordre traversal doit être strictement ordre croissant de leur apparence (ne peut pas être égale, ce qui augmente toujours dans l'ordre traversal). donc, la solution peut être juste un simple ordre traversal se rappelant le dernier noeud visité et la comparaison du noeud courant contre la dernière visite à un « < » (ou « > ») « .

Créé 30/03/2010 à 09:07
source utilisateur

voix
7

solution utilisant itératives afinde traversal.

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;
}
Créé 29/04/2011 à 22:35
source utilisateur

voix
0

solution récursive:

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)

    }
Créé 05/09/2011 à 16:36
source utilisateur

voix
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;
}
Créé 13/02/2012 à 21:08
source utilisateur

voix
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;
}
Créé 14/02/2012 à 10:34
source utilisateur

voix
-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));
}
Créé 05/03/2012 à 23:45
source utilisateur

voix
-1

Voici la solution itérative sans utiliser l'espace supplémentaire.

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;
    }
}
Créé 07/04/2012 à 02:07
source utilisateur

voix
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)
            )
        )
    );
}
Créé 20/05/2012 à 03:33
source utilisateur

voix
12

La meilleure solution que je trouve est O (n) et il utilise pas d'espace supplémentaire. Il est similaire à afinde mais traversal au lieu de stocker à tableau et vérifier ensuite si elle est triée, nous pouvons prendre une variable statique et vérifier en traversant afinde si un tableau est trié.

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;
}
Créé 06/06/2012 à 08:14
source utilisateur

voix
0

Pour savoir si BT est donnée BST pour tout type de données, vous avez besoin d'aller à l'approche ci-dessous. 1. appel de fonction récursive jusqu'à la fin du nœud feuille en utilisant afinde 2. Construisez votre traversal min et max vous des valeurs.

élément d'arbre doit avoir moins de / supérieur à opérateur défini.

#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;
}
Créé 13/06/2012 à 18:16
source utilisateur

voix
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;
}

Fonctionne bien :)

Créé 28/06/2012 à 11:24
source utilisateur

voix
0

Récursion est facile , mais approche itérative est meilleure, il y a une version itérative ci - dessus , mais il est beaucoup trop complexe que nécessaire. Voici la meilleure solution que c++vous trouverez jamais partout:

Cet algorithme fonctionne en O(N)temps et a besoin d' O(lgN)espace.

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;
}
Créé 04/11/2012 à 07:20
source utilisateur

voix
0

J'ai écrit une solution à utiliser afinde Traversal BST et vérifier si les noeuds augmente pour que l' espace O(1)et le temps O(n). TreeNode predecessorest prev noeud. Je ne suis pas sûr que la solution est juste ou non. Parce que le afinde Traversal ne peut pas définir un arbre entier.

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;

}
Créé 16/02/2013 à 03:25
source utilisateur

voix
0

Voici l'implémentation Java de BST validation, où nous voyageons l'arbre dans l'ordre DFS et il retourne false si nous obtenons un nombre qui est supérieur dernier numéro.

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;
  }
}
Créé 18/01/2014 à 06:58
source utilisateur

voix
3

Depuis le dans l'ordre traversal d'un BST est une séquence non-diminution, on pourrait utiliser cette propriété pour déterminer si un arbre binaire est BST ou non. En utilisant Morris traversal et maintenir le prenœud, nous pourrions obtenir une solution dans O (n) et O (1) espace complexité. Voici mon code

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;
}
Créé 18/10/2014 à 20:13
source utilisateur

voix
1

Je suis arrivé à cette question dans une interview téléphonique récemment eu du mal avec elle plus que je devrais avoir. Je tentais de garder une trace des minimums et maximums dans les nœuds enfants et je ne pouvais pas envelopper mon cerveau autour des différents cas sous la pression d'une entrevue.

Après y avoir réfléchi pendant l'endormissement hier soir, je me suis aperçu qu'il est aussi simple que garder la trace du dernier nœud que vous avez visités lors d'un parcours infixe. En Java:

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;
}
Créé 10/12/2014 à 05:21
source utilisateur

voix
0

solution itératives.

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;
}
Créé 15/12/2014 à 14:44
source utilisateur

voix
0

Cela fonctionne pour les doublons.

// 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)

Cela fonctionne même pour int.minet les int.maxvaleurs en utilisant les Nullabletypes.

// 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)
Créé 25/03/2015 à 08:16
source utilisateur

voix
0

Inspiré par http://www.jiuzhang.com/solutions/validate-binary-search-tree/

Il existe deux solutions générales: traversal et diviser && Conquer.

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);
    }
}
Créé 07/10/2015 à 05:24
source utilisateur

voix
-3

Voici ma solution récursive écrit en JavaScript

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);
}
Créé 19/10/2015 à 03:29
source utilisateur

voix
1

En Java et permettant des noeuds avec la même valeur dans les deux sous-arbre:

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);
}
Créé 10/09/2016 à 05:03
source utilisateur

voix
-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");
        }
    }
}
Créé 20/11/2017 à 20:30
source utilisateur

voix
2

Voici ma réponse en python, il a tous les cas d'angle traités et bien testé dans le site HackerRank

""" 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)
Créé 26/12/2017 à 18:04
source utilisateur

voix
0

Bon mot

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);
}

Assez longue ligne cependant.

Créé 15/01/2018 à 19:12
source utilisateur

voix
0

Voici une solution en Java de la classe algorithme de Sedgewick. Vérifiez la pleine mise en œuvre BST ici

J'ai ajouté quelques commentaires explicatifs

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);

}
Créé 30/10/2018 à 23:02
source utilisateur

voix
0
  • La iterativefonction vérifie si itérativement arbre donné est un arbre de recherche binaire.
  • La recursefonction vérifie si récursive arbre donné est un arbre de recherche binaire ou non.
  • En iterativefonction j'utilise BFS pour vérifier BST.
  • En recursefonction j'utilise DSF pour vérifier BST.
  • Les deux solutions ont une complexité temporelle de O(n)
  • iterativesolution présente un avantage par rapport à la recursesolution et qui est iterativesolution ne arrêt précoce.
  • Même la recursefonction peut être optimisée pour le début de l' arrêt par la valeur globale du pavillon.
  • L'idée à la fois la solution est que l'enfant gauche doit se situer dans la plage de -infinity à la valeur de son nœud parent whihch est le nœud racine
  • L'enfant doit être droit dans la plage de l'infini + à la valeur de son nœud parent whihch est le nœud racine
  • Et continuer à comparer la valeur du nœud courant dans la plage. Si la valeur de tout nœud est pas dans la plage puis retour Faux

    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)
    
Créé 01/11/2018 à 03:22
source utilisateur

voix
0

par exemple la mise en œuvre de Python. Cet exemple utilise le type d'annotations. Toutefois, depuis la classe Node utilise lui-même, nous devons inclure une première ligne du module:

from __future__ import annotations

Dans le cas contraire, vous obtiendrez une name 'Node' is not definederreur. Cet exemple utilise également DataClass comme un exemple. Pour vérifier si elle est BST , il utilise la récursivité pour vérifier les valeurs des nœuds gauche et à droite.

"""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))
Créé 16/01/2019 à 00:10
source utilisateur

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