Hoe maak je een binaire zoekboom valideren?

stemmen
54

Ik lees hier van een oefening in interviews die bekend staat als het valideren van een binaire zoekboom.

Hoe precies werkt dit? Wat zou men zoekt in het valideren van een binaire zoekboom? Ik heb geschreven een eenvoudige zoekopdracht boom, maar nog nooit gehoord van dit concept.

De vraag is gesteld op 01/02/2009 om 02:41
bron van user
In andere talen...                            


30 antwoorden

stemmen
13

"Valideren" een binaire zoekboom betekent dat u controleren of het inderdaad alle kleinere items op de linker en grote stukken aan de rechterkant. In wezen, het is een controle om te zien of een binaire boom is een binaire zoektocht boom.

antwoordde op 01/02/2009 om 02:44
bron van user

stemmen
106

Eigenlijk is dat de fout iedereen doet in een interview.

Leftchild worden gecontroleerd (minLimitof knooppunt node.value)

Rightchild worden getoetst (node.value, MaxLimit knooppunt)

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

Een andere oplossing (als de ruimte is geen beperking): Doe een ommet doorlopen van de boom en bewaar het knooppunt waarden in een matrix. Als de array in gesorteerde volgorde, zijn een geldig BST anders niet.

antwoordde op 17/04/2009 om 11:11
bron van user

stemmen
5

Hier is mijn oplossing in 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)))
antwoordde op 08/01/2010 om 08:30
bron van user

stemmen
1

"Het is beter om een ​​invariant eerst definiëren Hier is de invariante -. Elke twee opeenvolgende elementen van het BST in involgorde traversal moet strikt oplopende volgorde van hun uiterlijk (niet altijd gelijk zijn, verhogen in involgorde traversal). Dus oplossing kan gewoon een eenvoudige in-order traversal met het onthouden van de laatst bezochte knooppunt en vergelijking het huidige knooppunt ten opzichte van de laatste zijn bezoek aan een tot '<' (of '>')."

antwoordde op 30/03/2010 om 09:07
bron van user

stemmen
7

Iteratieve oplossing met behulp van inorder 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;
}
antwoordde op 29/04/2011 om 22:35
bron van user

stemmen
0

Recursieve oplossing:

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)

    }
antwoordde op 05/09/2011 om 16:36
bron van user

stemmen
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;
}
antwoordde op 13/02/2012 om 21:08
bron van user

stemmen
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;
}
antwoordde op 14/02/2012 om 10:34
bron van user

stemmen
-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));
}
antwoordde op 05/03/2012 om 23:45
bron van user

stemmen
-1

Hier is de iteratieve oplossing zonder het gebruik van extra ruimte.

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;
    }
}
antwoordde op 07/04/2012 om 02:07
bron van user

stemmen
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)
            )
        )
    );
}
antwoordde op 20/05/2012 om 03:33
bron van user

stemmen
12

De beste oplossing die ik gevonden is O (n) en het maakt geen gebruik van extra ruimte. Het is vergelijkbaar met inorder traversal maar in plaats van slaan array en dan controleren of het valt kunnen we een statische variabele nemen en controleren tijdens het doorlopen ommet of array wordt gesorteerd.

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;
}
antwoordde op 06/06/2012 om 08:14
bron van user

stemmen
0

Om te achterhalen of bepaalde BT is BST voor een datatype, moet je gaan met een lager dan aanpak. 1. call recursieve functie tot het einde van het blad knooppunt gebruik inorder traversal 2. Bouw je min en max waarden jezelf.

Boom element moet kleiner zijn dan / groter dan operator gedefinieerd.

#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;
}
antwoordde op 13/06/2012 om 18:16
bron van user

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

Werkt prima :)

antwoordde op 28/06/2012 om 11:24
bron van user

stemmen
0

Recursie is gemakkelijk, maar iteratieve aanpak is beter, er is een iteratieve versie hierboven, maar het is veel te complex dan nodig is. Hier is de beste oplossing in c++je ooit zult vinden overal:

Dit algoritme loopt in O(N)de tijd en moet O(lgN)de ruimte.

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;
}
antwoordde op 04/11/2012 om 07:20
bron van user

stemmen
0

Ik schreef een oplossing te gebruiken inorder Traversal BST en controleer of de knooppunten wordt oplopende volgorde naar ruimte O(1)en tijd O(n). TreeNode predecessorwordt prev knooppunt. Ik ben niet zeker of de oplossing juist is of niet is. Omdat de inorder kan Traversal niet een hele boom te definiëren.

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;

}
antwoordde op 16/02/2013 om 03:25
bron van user

stemmen
0

Hieronder vindt u de Java-implementatie van BST validatie, waar we reizen de boom in orde DFS en het geeft false als we een aantal dat groter is dan vorig 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;
  }
}
antwoordde op 18/01/2014 om 06:58
bron van user

stemmen
3

Omdat de in-order traversal van een BST is een non-afname volgorde, kunnen we deze eigenschap gebruiken om te beoordelen of een binaire boom is BST is of niet. Met behulp van Morris traversal en onderhouden van de preknoop, konden we een oplossing in te krijgen O (n) tijd en O (1) ruimte complexiteit. Hier is mijn 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;
}
antwoordde op 18/10/2014 om 20:13
bron van user

stemmen
1

Ik heb deze vraag in een telefonisch interview onlangs en had moeite met het meer dan ik zou moeten hebben. Ik probeerde te houden van minima en maxima in onderliggende knooppunten te houden en ik kon gewoon niet wrap mijn hersenen rond de verschillende zaken onder de druk van een interview.

Na te denken over het terwijl in slaap vallen gisteravond, realiseerde ik me dat het is zo simpel als het bijhouden van de laatste knoop die u tijdens een inorder traversal heeft bezocht. In 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;
}
antwoordde op 10/12/2014 om 05:21
bron van user

stemmen
0

Iteratieve oplossing.

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;
}
antwoordde op 15/12/2014 om 14:44
bron van user

stemmen
0

Dit werkt voor duplicaten.

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

Dit werkt zelfs voor int.minen int.maxwaarden met behulp van 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)
antwoordde op 25/03/2015 om 08:16
bron van user

stemmen
0

Geïnspireerd door http://www.jiuzhang.com/solutions/validate-binary-search-tree/

Er zijn twee algemene oplossingen: traversal en verdeel && heers.

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);
    }
}
antwoordde op 07/10/2015 om 05:24
bron van user

stemmen
-3

Hier is mijn recursieve oplossing geschreven in 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);
}
antwoordde op 19/10/2015 om 03:29
bron van user

stemmen
1

In Java en het toestaan ​​van knooppunten met dezelfde waarde in beide sub-boom:

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);
}
antwoordde op 10/09/2016 om 05:03
bron van user

stemmen
-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");
        }
    }
}
antwoordde op 20/11/2017 om 20:30
bron van user

stemmen
2

Hier is mijn antwoord in python, het heeft alle de hoek gevallen aangepakt en getest in hackerrank website

""" 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)
antwoordde op 26/12/2017 om 18:04
bron van user

stemmen
0

Oneliner

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

Mooie lange rij wel.

antwoordde op 15/01/2018 om 19:12
bron van user

stemmen
0

Hier is een oplossing in Java van Sedgewick's algoritme klasse. Controleer de volledige BST implementatie hier

Ik voegde enkele toelichting

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

}
antwoordde op 30/10/2018 om 23:02
bron van user

stemmen
0
  • De iterativefunctie controleert iteratief of gegeven boom is een binaire zoekboom.
  • De recursefunctie controleert recursief of gegeven boom is een binaire zoekboom of niet.
  • In iterativefunctie gebruik ik BFS voor het controleren van BST.
  • In recursefunctie gebruik ik DFS voor het controleren van BST.
  • Beide oplossingen hebben een tijd complexiteit van O(n)
  • iterativeoplossing heeft een voordeel ten opzichte van recurseoplossing en dat is de iterativeoplossing doet vroeg stoppen.
  • Zelfs recursefunctie kan worden geoptimaliseerd voor het begin van stoppen door de wereldwijde vlag waarde.
  • Het idee van zowel de oplossing is dat de linkerkind moet binnen het bereik van oneindig tot de waarde van de bovenliggende knooppunt whihch is het hoofdknooppunt
  • De rechterkind dient binnen het traject van + oneindig tot de waarde van de bovenliggende knooppunt whihch is het hoofdknooppunt
  • En ga op het vergelijken van de waarde van het huidige knooppunt binnen het bereik. Als de waarde van een willekeurig knooppunt is niet in het bereik dan terug 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)
    
antwoordde op 01/11/2018 om 03:22
bron van user

stemmen
0

Python implementatie voorbeeld. In dit voorbeeld wordt het type annotaties. Maar sinds Node klasse zelf gebruikt moeten we als een eerste lijn van de module op te nemen:

from __future__ import annotations

Anders krijg je name 'Node' is not definedfouten. Dit voorbeeld maakt ook gebruik van dataclass als voorbeeld. Om te controleren of het BST het gebruikt recursie voor het controleren van de linker en rechter knooppunten waarden.

"""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))
antwoordde op 16/01/2019 om 00:10
bron van user

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