Wie validieren Sie einen binären Suchbaum?

stimmen
54

Ich las hier von einer Übung auf in Interviews bekannt als einen binären Suchbaum zu validieren.

Wie genau funktioniert das? Was würde man sucht einen binären Suchbaum bei der Validierung? Ich habe einen grundlegenden Suchbaum geschrieben, aber nie von diesem Konzept gehöre.

Veröffentlicht am 01/02/2009 um 02:41
quelle vom benutzer
In anderen Sprachen...                            


30 antworten

stimmen
13

„Validieren“ ein binärer Suchbaum bedeutet , dass Sie prüfen, ob es in der Tat alle kleineren Gegenstände auf der linken und große Gegenstände auf der rechten Seite hat. Im Wesentlichen ist es eine Prüfung , um zu sehen , ob ein Binärbaum ein binärer ist Suchbaum.

Beantwortet am 01/02/2009 um 02:44
quelle vom benutzer

stimmen
106

Eigentlich ist, dass der Fehler jeder hat in einem Interview.

Leftchild muss gegen (minLimitof Knoten, node.value) überprüft werden

Rightchild müssen gegen überprüft werden (node.value, MaxLimit des Knotens)

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

Eine weitere Lösung (sofern genügend Platz ist keine Einschränkung): Do eine Inorder Traversierung des Baums und speichern die Knotenwerte in einem Array. Wenn das Array in sortierter Reihenfolge, seine gültige BST sonst nicht.

Beantwortet am 17/04/2009 um 11:11
quelle vom benutzer

stimmen
5

Hier ist meine Lösung 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)))
Beantwortet am 08/01/2010 um 08:30
quelle vom benutzer

stimmen
1

„Es ist besser, eine unveränderliche zuerst zu definieren Hier die unveränderlich ist -. Alle zwei aufeinanderfolgende Elemente des BST in der In-Order-Traversal in streng monoton wachsend Reihenfolge ihres Erscheinens sein muss (kann nicht gleich sein, die Erhöhung immer in in Ordnung Traversal). kann also Lösung nur ein einfacher in-Order-Traversal sein, mit dem zuletzt besuchten Knoten und Vergleich die aktuellen Knoten gegen die zuletzt besuchte eine zu ‚<‘ (oder ‚>‘) zu erinnern.“

Beantwortet am 30/03/2010 um 09:07
quelle vom benutzer

stimmen
7

Iterative Lösung Inorder Traversal verwenden.

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;
}
Beantwortet am 29/04/2011 um 22:35
quelle vom benutzer

stimmen
0

Rekursive Lösung:

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)

    }
Beantwortet am 05/09/2011 um 16:36
quelle vom benutzer

stimmen
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;
}
Beantwortet am 13/02/2012 um 21:08
quelle vom benutzer

stimmen
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;
}
Beantwortet am 14/02/2012 um 10:34
quelle vom benutzer

stimmen
-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));
}
Beantwortet am 05/03/2012 um 23:45
quelle vom benutzer

stimmen
-1

Hier ist die iterative Lösung ohne zusätzlichen Platzbedarf.

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;
    }
}
Beantwortet am 07/04/2012 um 02:07
quelle vom benutzer

stimmen
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)
            )
        )
    );
}
Beantwortet am 20/05/2012 um 03:33
quelle vom benutzer

stimmen
12

Die beste Lösung, die ich gefunden ist O (n) und verwendet es keinen zusätzlichen Platz. Es ist ähnlich wie Inorder Traversal aber anstatt sie zu Array zu speichern und dann zu prüfen, ob sie sortiert ist, dass wir eine statische Variable nehmen und überprüfen, während Inorder durchlaufen, ob Array sortiert ist.

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;
}
Beantwortet am 06/06/2012 um 08:14
quelle vom benutzer

stimmen
0

Um herauszufinden, ob gegeben BT BST für jeden Datentyp ist, müssen Sie mit folgendem Ansatz gehen. 1. Aufruf rekursive Funktion bis zum Ende des Blattknoten Inorder Traversal mit 2. Erstellen Sie Ihre Min- und Max-Werte selbst.

Baumelement muss kleiner / größer als Operator definiert.

#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;
}
Beantwortet am 13/06/2012 um 18:16
quelle vom benutzer

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

Funktioniert gut :)

Beantwortet am 28/06/2012 um 11:24
quelle vom benutzer

stimmen
0

Rekursion ist einfach , aber iterativer Ansatz ist besser, es ist eine iterative Version oben , aber es ist viel zu komplex , als notwendig. Hier ist die beste Lösung in c++Sie überhaupt überall finden:

Dieser Algorithmus läuft in O(N)Zeit und braucht O(lgN)Raum.

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;
}
Beantwortet am 04/11/2012 um 07:20
quelle vom benutzer

stimmen
0

Ich schrieb eine Lösung Inorder Traversal BST zu verwenden und überprüfen , ob die Knoten um Raum zu erhöhen O(1)und Zeit O(n). TreeNode predecessorwird prev Knoten. Ich bin nicht sicher , ob die Lösung richtig ist oder nicht. Da die Inorder Traversal kann einen ganzen Baum nicht definieren.

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;

}
Beantwortet am 16/02/2013 um 03:25
quelle vom benutzer

stimmen
0

Im Anschluss ist die Java-Implementierung von BST-Validierung, wo wir den Baum in Ordnung DFS reisen und es gibt false zurück, wenn wir eine beliebige Anzahl erhalten, die größer ist als letzte Zahl ist.

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;
  }
}
Beantwortet am 18/01/2014 um 06:58
quelle vom benutzer

stimmen
3

Da die in Ordnung Traversal eines BST eine Nicht-Abnahme - Sequenz ist, könnten wir diese Eigenschaft beurteilen verwenden , ob ein Binärbaum BST ist oder nicht. Mit Morris Traversal und die Aufrechterhaltung preKnoten, konnten wir eine Lösung in erhalten O (n) Zeit und O (1) Raum Komplexität. Hier ist mein 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;
}
Beantwortet am 18/10/2014 um 20:13
quelle vom benutzer

stimmen
1

Ich habe diese Frage in einem Telefon-Interview vor kurzem und kämpfte mit ihm mehr als ich sollte. Ich habe versucht, den Überblick über Minima und Maxima in untergeordneten Knoten zu halten und ich konnte einfach nicht wickeln mein Gehirn um die verschiedenen Fälle unter dem Druck eines Interviews.

Nachdem darüber nachzudenken beim Einschlafen letzte Nacht fallen, erkannte ich, dass es so einfach ist, den Überblick über die letzten Knoten wie halten Sie während eines Inorder Traversal besucht haben. 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;
}
Beantwortet am 10/12/2014 um 05:21
quelle vom benutzer

stimmen
0

Iterative Lösung.

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;
}
Beantwortet am 15/12/2014 um 14:44
quelle vom benutzer

stimmen
0

Dies funktioniert für Duplikate.

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

Dies funktioniert auch für int.minund int.maxWerten NullableTypen.

// 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)
Beantwortet am 25/03/2015 um 08:16
quelle vom benutzer

stimmen
0

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

Es gibt zwei allgemeine Lösungen: Traversal und dividieren && erobern.

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);
    }
}
Beantwortet am 07/10/2015 um 05:24
quelle vom benutzer

stimmen
-3

Hier ist meine rekursive Lösung in JavaScript geschrieben

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);
}
Beantwortet am 19/10/2015 um 03:29
quelle vom benutzer

stimmen
1

In Java und ermöglicht Knoten mit dem gleichen Wert in entweder Unterbaum:

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);
}
Beantwortet am 10/09/2016 um 05:03
quelle vom benutzer

stimmen
-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");
        }
    }
}
Beantwortet am 20/11/2017 um 20:30
quelle vom benutzer

stimmen
2

Hier ist meine Antwort in Python, hat es die ganze Ecke Fälle angesprochen und auch in getestet 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)
Beantwortet am 26/12/2017 um 18:04
quelle vom benutzer

stimmen
0

Einzeiler

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

Ziemlich zwar schon lange Linie.

Beantwortet am 15/01/2018 um 19:12
quelle vom benutzer

stimmen
0

Hier ist eine Lösung in Java von sedgewick-Algorithmus - Klasse. Schauen Sie sich die volle BST Implementierung hier

Ich habe einige Erläuterungen

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

}
Beantwortet am 30/10/2018 um 23:02
quelle vom benutzer

stimmen
0
  • Die iterativeFunktion prüft iterativ ob bestimmte Baum ein binärer Suchbaum ist.
  • Die recurseFunktion überprüft rekursiv , ob gegebener Baum ein binärer Suchbaum ist oder nicht.
  • In iterativeFunktion verwende ich bfs für BST überprüfen.
  • In recurseFunktion verwende ich dfs für BST überprüfen.
  • Beide Lösungen haben eine Zeitkomplexität O(n)
  • iterativeLösung hat einen Vorteil gegenüber recurseLösung und das ist iterativeLösung frühe Beendigung der Fall ist.
  • Selbst recurseFunktion kann zur frühzeitigen Anhalten durch die globale Flag - Wert optimiert werden.
  • Die Idee, sowohl von der Lösung ist, dass das linke Kind im Bereich von -Infinity auf den Wert des übergeordneten Knotens whihch der Wurzelknoten ist, sein sollte,
  • Das rechte Kind im Bereich von + Unendlich auf den Wert seines Elternknotens sein sollte whihch der Wurzelknoten ist,
  • Und gehen Sie den aktuellen Knotens Wert innerhalb des Bereichs auf den Vergleich. Wenn jeder Knoten des Wert nicht in dem Bereich ist dann return 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)
    
Beantwortet am 01/11/2018 um 03:22
quelle vom benutzer

stimmen
0

Python-Implementierung Beispiel. Dieses Beispiel verwendet Anmerkungen eingeben. Da jedoch Node-Klasse verwendet, selbst benötigen wir als erste Zeile des Moduls sind:

from __future__ import annotations

Andernfalls werden Sie erhalten name 'Node' is not definedFehler. In diesem Beispiel wird auch als Beispiel Dataclass. Um zu überprüfen , ob es BST ist es Rekursion verwendet für die linken und rechten Knoten Werte zu überprüfen.

"""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))
Beantwortet am 16/01/2019 um 00:10
quelle vom benutzer

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