Hvordan validere trenger et binært søketre?

stemmer
55

Jeg leste på her fra en øvelse i intervjuer kjent som validere et binært søketre.

Hvordan akkurat gjør dette arbeidet? Hva ville man være ute etter i å validere et binært søketre? Jeg har skrevet et enkelt søk treet, men aldri hørt om dette konseptet.

Publisert på 01/02/2009 klokken 01:41
kilden bruker
På andre språk...                            


30 svar

stemmer
13

"Validere" et binært søketre betyr at du sjekker at det faktisk har alle småting på venstre og store elementer på høyre side. I hovedsak er det en sjekk for å se om et binært tre er et binært søk treet.

Svarte 01/02/2009 kl. 01:44
kilden bruker

stemmer
107

Faktisk det er feil alle gjør i et intervju.

Leftchild må kontrolleres mot (minLimitof node, node.value)

Rightchild må kontrolleres mot (node.value, MaxLimit av 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;
}

En annen løsning (hvis plassen er ikke en begrensning): Har en inorder traversering av treet og lagre nodeverdiene i en matrise. Hvis matrisen er i sortert rekkefølge, det er en gyldig BST ellers ikke.

Svarte 17/04/2009 kl. 10:11
kilden bruker

stemmer
5

Her er min løsning i 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)))
Svarte 08/01/2010 kl. 07:30
kilden bruker

stemmer
1

"Det er bedre å definere en invariant første Her er invariant er -. Eventuelle to sekvensielle elementer av BST i in-order traversering må være strengt stigende rekkefølge av deres utseende (kan ikke være like, øker alltid i in-order traversering). slik løsning kan være bare et enkelt i-rekkefølge traversering med å huske det sist besøkte noden og sammenligning gjeldende node mot den sist besøkte en til '<' (eller '>')."

Svarte 30/03/2010 kl. 08:07
kilden bruker

stemmer
7

Iterativ løsning med inorder traversering.

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;
}
Svarte 29/04/2011 kl. 21:35
kilden bruker

stemmer
0

Rekursiv løsning:

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)

    }
Svarte 05/09/2011 kl. 15:36
kilden bruker

stemmer
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;
}
Svarte 13/02/2012 kl. 20:08
kilden bruker

stemmer
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;
}
Svarte 14/02/2012 kl. 09:34
kilden bruker

stemmer
-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));
}
Svarte 05/03/2012 kl. 22:45
kilden bruker

stemmer
-1

Her er en iterativ løsning uten bruk av ekstra plass.

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;
    }
}
Svarte 07/04/2012 kl. 01:07
kilden bruker

stemmer
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)
            )
        )
    );
}
Svarte 20/05/2012 kl. 02:33
kilden bruker

stemmer
12

Den beste løsningen fant er O (n) og den bruker ikke noe ekstra plass. Det ligner på inorder traversering men i stedet for å lagre det til matrise og deretter sjekke om det er sortert vi kan ta en statisk variabel og sjekke når inorder traversering om tabellen er sortert.

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;
}
Svarte 06/06/2012 kl. 07:14
kilden bruker

stemmer
0

For å finne ut om gitt BT er BST for noen datatype, må du gå med under tilnærming. 1. samtale rekursiv funksjon til slutten av bladnoden ved hjelp inorder traversering 2. Bygg din min og maks verdier selv.

Tre element må ha mindre enn / større enn operatør definert.

#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;
}
Svarte 13/06/2012 kl. 17:16
kilden bruker

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

Fungerer fint :)

Svarte 28/06/2012 kl. 10:24
kilden bruker

stemmer
0

Rekursjon er lett, men iterativ tilnærming er bedre, det er en iterativ versjon ovenfor, men det er altfor komplisert enn nødvendig. Her er den beste løsningen i c++du noensinne vil finne sted:

Denne algoritmen kjører i O(N)gang og trenger O(lgN)plass.

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;
}
Svarte 04/11/2012 kl. 06:20
kilden bruker

stemmer
0

Jeg skrev en løsning å bruke inorder overgang BST og sjekk om nodene er stigende for plass O(1)og tid O(n). TreeNode predecessorer prev node. Jeg er ikke sikker på at løsningen er riktig eller ikke. Fordi inorder overgang ikke kan definere en hele treet.

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;

}
Svarte 16/02/2013 kl. 02:25
kilden bruker

stemmer
0

Følgende er Java gjennomføringen av BST validering, hvor vi reiser treet i for DFS og den returnerer false hvis vi får noen tall som er større enn forrige nummer.

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;
  }
}
Svarte 18/01/2014 kl. 05:58
kilden bruker

stemmer
3

Siden i-order traversering av en BST er en ikke-nedgang sekvens, kan vi bruke denne egenskapen til å bedømme om et binært tre er BST eller ikke. Ved hjelp av Morris traversering og opprettholdelse av prenode, kan vi få en oppløsning i O (n), og O (1) plass kompleksitet. Her er min kode

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;
}
Svarte 18/10/2014 kl. 19:13
kilden bruker

stemmer
1

Jeg fikk dette spørsmålet i en telefon intervju nylig, og slet med det mer enn jeg burde ha. Jeg prøvde å holde styr på minimumskrav og maksimumsgrenser i barnet noder og jeg kunne ikke vikle hjernen min rundt de ulike tilfellene under trykket av et intervju.

Etter å ha tenkt på det mens det sovner i går kveld, innså jeg at det er så enkelt som å holde styr på den siste noden du har besøkt i løpet av en inorder traversering. I 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;
}
Svarte 10/12/2014 kl. 05:21
kilden bruker

stemmer
0

Iterativ løsning.

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;
}
Svarte 15/12/2014 kl. 14:44
kilden bruker

stemmer
0

Dette fungerer for duplikater.

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

Dette fungerer også for int.minog int.maxverdier ved hjelp av Nullabletyper.

// 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)
Svarte 25/03/2015 kl. 08:16
kilden bruker

stemmer
0

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

Det er to generelle løsninger: traversering og dele && erobring.

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);
    }
}
Svarte 07/10/2015 kl. 05:24
kilden bruker

stemmer
-3

Her er min rekursiv løsning skrevet i 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);
}
Svarte 19/10/2015 kl. 03:29
kilden bruker

stemmer
1

I Java og tillater noder med samme verdi i den ene eller sub-treet:

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);
}
Svarte 10/09/2016 kl. 05:03
kilden bruker

stemmer
-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");
        }
    }
}
Svarte 20/11/2017 kl. 20:30
kilden bruker

stemmer
2

Her er mitt svar i python, har den alle hjørne tilfeller adressert og godt testet i hackerrank hjemmeside

""" 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)
Svarte 26/12/2017 kl. 18:04
kilden bruker

stemmer
0

en liner

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

Ganske lang kø skjønt.

Svarte 15/01/2018 kl. 19:12
kilden bruker

stemmer
0

Her er en løsning i java fra Sedgewick algoritme klasse. Sjekk den fullstendige BST gjennomføringen her

Jeg har lagt noen forklarende kommentarer

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

}
Svarte 30/10/2018 kl. 23:02
kilden bruker

stemmer
0
  • Den iterativefunksjonen sjekker iterativt enten gitt tre er et binært søketre.
  • Den recursefunksjonen sjekker rekursivt enten gitt tre er et binært søketre eller ikke.
  • I iterativefunksjon jeg bruker BFS for kontroll BST.
  • I recursefunksjon jeg bruker dfs for kontroll BST.
  • Begge løsningene har en tid kompleksitet O(n)
  • iterativeLøsningen har en fordel i forhold til recurseløsningen, og det er iterativebilligere løsning vil tidlig stans.
  • Selv recursefunksjon kan optimaliseres for tidlig stopp av global flagg verdi.
  • Ideen om begge løsningen er at venstre barnet bør være innenfor området -infinity til verdien av sine overordnede noden whihch er rotnoden
  • Den høyre Barnet bør være i området fra + uendelig til verdien av sin foreldrenoden whihch er rotnoden
  • Og gå på en sammenligning av gjeldende node verdi innenfor området. Hvis noen node verdi ikke er i området så tilbake False

    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)
    
Svarte 01/11/2018 kl. 03:22
kilden bruker

stemmer
0

Python implementering eksempel. Dette eksempelet bruker å skrive kommentarer. Men siden Node klassen bruker selv vi må ta som en første linje av modulen:

from __future__ import annotations

Ellers vil du få name 'Node' is not definedfeil. I dette eksemplet brukes også dataclass som et eksempel. For å sjekke om det er BST den bruker rekursjon for å sjekke venstre og høyre noder verdier.

"""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))
Svarte 16/01/2019 kl. 00:10
kilden bruker

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