¿Cómo se valida un árbol de búsqueda binario?

votos
54

Leí aquí un ejercicio de entrevistas conocido como validación de un árbol de búsqueda binario.

¿Cómo funciona esto exactamente? ¿Qué se estaría buscando para validar un árbol de búsqueda binario? Escribí un árbol de búsqueda básico, pero nunca escuché acerca de este concepto.

Publicado el 01/02/2009 a las 02:41
fuente por usuario
En otros idiomas...                            


30 respuestas

votos
13

"Validar" un árbol de búsqueda binario significa que usted verifica que sí tiene todos los elementos más pequeños a la izquierda y los grandes a la derecha. Básicamente, es un control para ver si un árbol binario es un árbol de búsqueda binario .

Respondida el 01/02/2009 a las 02:44
fuente por usuario

votos
106

En realidad ese es el error que todos hacen en una entrevista.

Leftchild se debe comparar con (minLimitof node, node.value)

Se debe comparar a Rightchild con (node.value, MaxLimit of node)

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

Otra solución (si el espacio no es una restricción): realice un recorrido inorden del árbol y almacene los valores del nodo en una matriz. Si la matriz está ordenada, es una BST válida; de lo contrario, no.

Respondida el 17/04/2009 a las 11:11
fuente por usuario

votos
5

Aquí está mi solución en 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)))
Respondida el 08/01/2010 a las 08:30
fuente por usuario

votos
1

"Es mejor definir una invariante primera Aquí el invariante es -. Cualesquiera dos elementos secuenciales del BST en el recorrido en orden debe estar en estrictamente creciente orden de aparición (no puede ser igual, siempre en aumento en el in-fin de recorrido). Entonces, la solución puede ser un simple recorrido en orden con recordar el último nodo visitado y la comparación del nodo actual en contra de la última visita a uno '<' (o '>') ".

Respondida el 30/03/2010 a las 09:07
fuente por usuario

votos
7

solución iterativa utilizando finde 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;
}
Respondida el 29/04/2011 a las 22:35
fuente por usuario

votos
0

solución recursiva:

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)

    }
Respondida el 05/09/2011 a las 16:36
fuente por usuario

votos
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;
}
Respondida el 13/02/2012 a las 21:08
fuente por usuario

votos
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;
}
Respondida el 14/02/2012 a las 10:34
fuente por usuario

votos
-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));
}
Respondida el 05/03/2012 a las 23:45
fuente por usuario

votos
-1

Aquí está la solución iterativa sin utilizar espacio adicional.

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;
    }
}
Respondida el 07/04/2012 a las 02:07
fuente por usuario

votos
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)
            )
        )
    );
}
Respondida el 20/05/2012 a las 03:33
fuente por usuario

votos
12

La mejor solución que he encontrado es O (n) y se utiliza ningún espacio adicional. Es similar al recorrido en orden, pero en lugar de almacenarla a la matriz y luego comprobar si se ordena podemos tomar una variable estática y comprobar mientras finde atravesar si se ordena matriz.

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;
}
Respondida el 06/06/2012 a las 08:14
fuente por usuario

votos
0

Para averiguar si es dada BT BST para cualquier tipo de datos, es necesario ir con el enfoque de abajo. 1. llamada a la función recursiva hasta el fin del nudo de la hoja usando recorrido inorder 2. Construir su mínimo y máximo valora a sí mismo.

elemento de árbol debe tener menos de / operador mayor que define.

#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;
}
Respondida el 13/06/2012 a las 18:16
fuente por usuario

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

Funciona bien :)

Respondida el 28/06/2012 a las 11:24
fuente por usuario

votos
0

La recursividad es fácil, pero es mejor enfoque iterativo, hay una versión iterativa anteriormente, pero que es demasiado compleja de lo necesario. Aquí es la mejor solución en la c++que jamás encontrar en cualquier lugar:

Este algoritmo se ejecuta en O(N)tiempo y necesita O(lgN)espacio.

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;
}
Respondida el 04/11/2012 a las 07:20
fuente por usuario

votos
0

Escribí una solución a utilizar finde Transversal BST y comprobar si los nodos es cada vez mayor para que el espacio O(1)y el tiempo O(n). TreeNode predecessorse prev nodo. No estoy seguro de que la solución es correcta o no. Debido a que el finde de recorrido no puede definir un árbol entero.

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;

}
Respondida el 16/02/2013 a las 03:25
fuente por usuario

votos
0

A continuación se presenta la implementación en Java de validación BST, donde recorremos el árbol DFS en orden y devuelve falso si tenemos cualquier número que es mayor que en la última serie.

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;
  }
}
Respondida el 18/01/2014 a las 06:58
fuente por usuario

votos
3

Desde el recorrido en el orden de un BST es una secuencia no descenso, podríamos utilizar esta propiedad para juzgar si un árbol binario es BST o no. Usando Morris traversal y mantener el prenodo, podríamos obtener una solución en tiempo O (n) y O (1) espacio de complejidad. Aquí está mi código

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;
}
Respondida el 18/10/2014 a las 20:13
fuente por usuario

votos
1

Tengo esta pregunta en una entrevista telefónica reciente y luché con él más de lo debido. Yo estaba tratando de hacer un seguimiento de mínimos y máximos en los nodos secundarios y simplemente no podía envolver mi cerebro alrededor de los diferentes casos bajo la presión de una entrevista.

Después de pensar en ello mientras se queda dormido la noche anterior, me di cuenta de que es tan simple como hacer el seguimiento del último nodo que ha visitado durante una recorrido en orden. 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;
}
Respondida el 10/12/2014 a las 05:21
fuente por usuario

votos
0

solución iterativa.

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;
}
Respondida el 15/12/2014 a las 14:44
fuente por usuario

votos
0

Esto funciona para los duplicados.

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

Esto funciona incluso para int.miny int.maxvalores utilizando Nullabletipos.

// 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)
Respondida el 25/03/2015 a las 08:16
fuente por usuario

votos
0

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

Hay dos soluciones generales: recorrido y se dividen && conquista.

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);
    }
}
Respondida el 07/10/2015 a las 02:24
fuente por usuario

votos
-3

Aquí está mi solución recursiva escrito 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);
}
Respondida el 19/10/2015 a las 00:29
fuente por usuario

votos
1

En Java y permitiendo nodos con mismo valor en cualquier sub-árbol:

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);
}
Respondida el 10/09/2016 a las 02:03
fuente por usuario

votos
-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");
        }
    }
}
Respondida el 20/11/2017 a las 17:30
fuente por usuario

votos
2

Aquí está mi respuesta en Python, que tiene todos los casos de esquina dirigidas y bien probado en el sitio web 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)
Respondida el 26/12/2017 a las 15:04
fuente por usuario

votos
0

Un trazador de líneas

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

Bastante línea de largo sin embargo.

Respondida el 15/01/2018 a las 16:12
fuente por usuario

votos
0

He aquí una solución en Java de la clase de algoritmo de Sedgewick. Comprobar la aplicación BST completa aquí

He añadido algunos comentarios explicativos

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

}
Respondida el 30/10/2018 a las 23:02
fuente por usuario

votos
0
  • La iterativefunción comprueba si iterativa árbol dado es un árbol de búsqueda binaria.
  • La recursefunción comprueba si recursiva árbol dado es un árbol binario de búsqueda o no.
  • En iterativefunción utilizo BFS para el control de la STB.
  • En recursefunción de uso DFS para el control de la STB.
  • Ambas soluciones tienen un tiempo de complejidad O(n)
  • iterativesolución tiene una ventaja sobre recursesolución y que es iterativela solución que hace a principios de parada.
  • Incluso recursefunción puede ser optimizado para la interrupción temprana por valor global de bandera.
  • La idea tanto de la solución es que el hijo izquierdo debe estar dentro del rango de -infinity al valor de su nodo padre whihch es el nodo raíz
  • El hijo derecho debe estar dentro del rango de + infinito al valor de su nodo padre whihch es el nodo raíz
  • E ir en comparar el valor del nodo actual dentro de la gama. Si el valor de cualquier nodo no está en el rango luego regresar Falso

    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)
    
Respondida el 01/11/2018 a las 03:22
fuente por usuario

votos
0

implementación de Python ejemplo. Este ejemplo utiliza escriba anotaciones. Sin embargo, desde la clase Nodo utiliza en sí necesitamos incluir como primera línea del módulo:

from __future__ import annotations

De lo contrario, obtendrá name 'Node' is not definedel error. Este ejemplo también utiliza DATACLASS como un ejemplo. Para comprobar si se trata de BST se utiliza la recursividad para el control de los valores de los nodos de izquierda y derecha.

"""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))
Respondida el 16/01/2019 a las 00:10
fuente por usuario

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