Recherche…


Si une arborescence donnée suit la propriété de l'arborescence de recherche binaire ou non

Par exemple

si l'entrée est:

entrer la description de l'image ici

La sortie doit être fausse:

Comme 4 dans le sous-arbre de gauche est supérieur à la valeur de la racine (3)

Si l'entrée est:

entrer la description de l'image ici

La sortie devrait être vraie

Algorithme pour vérifier si un arbre binaire donné est BST

Un arbre binaire est BST s'il satisfait à l'une des conditions suivantes:

  1. C'est vide
  2. Il n'y a pas de sous-arbre
  3. Pour chaque nœud x dans l'arborescence, toutes les clés (s'il y en a) dans la sous-arborescence gauche doivent être inférieures à la clé (x) et toutes les clés (s'il y en a) dans la sous-arborescence doivent être supérieures à la clé (x).

Un algorithme récursif simple serait donc:

is_BST(root):
  if root == NULL:
   return true

  // Check values in left subtree
  if root->left != NULL:
    max_key_in_left = find_max_key(root->left)
    if max_key_in_left > root->key:
        return false

  // Check values in right subtree
  if root->right != NULL:
    min_key_in_right = find_min_key(root->right)
    if min_key_in_right < root->key:
        return false

  return is_BST(root->left) && is_BST(root->right)

L'algorithme récursif ci-dessus est correct mais inefficace, car il traverse chaque nœud à plusieurs reprises.

Une autre approche pour minimiser les visites multiples de chaque nœud consiste à mémoriser les valeurs min et max possibles des clés dans le sous-arbre que nous visitons. Soit la valeur minimale possible de n'importe quelle clé soit K_MIN et la valeur maximale soit K_MAX . Lorsque nous partons de la racine de l'arborescence, la plage de valeurs de l'arborescence est [K_MIN,K_MAX] . Soit la clé du noeud racine x . Ensuite, la plage de valeurs dans le sous-arbre de gauche est [K_MIN,x) et la plage de valeurs dans le sous-arbre de droite est (x,K_MAX] . Nous utiliserons cette idée pour développer un algorithme plus efficace.

is_BST(root, min, max):
    if root == NULL:
        return true

    // is the current node key out of range?
    if root->key < min || root->key > max:
        return false

    // check if left and right subtree is BST
    return is_BST(root->left,min,root->key-1) && is_BST(root->right,root->key+1,max)

Il s'appellera initialement comme:

is_BST(my_tree_root,KEY_MIN,KEY_MAX)

Une autre approche consistera à effectuer une traversée de l'ordre de l'arbre binaire. Si la traversée d'inorder produit une séquence de clés triée, l'arbre donné est un BST. Pour vérifier si la séquence d'inordres est triée, mémorisez la valeur du nœud précédemment visité et comparez-la au nœud actuel.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow