2017-07-28 3 views
0

J'ai commencé à faire un problème de BST sur Hackerrank, où je devrais retourner vrai si un arbre est un BST, et faux sinon. J'échoue 4 des 20 cas et je ne sais pas pourquoi. La personne qui a fait ce problème n'a pas fourni d'informations détaillées sur la manière dont il gère les entrées et fabrique l'arbre.Le code permettant de vérifier si un arbre est un arbre de recherche binaire en Java échoue aux cas de test. Je ne sais pas pourquoi

Voici mon code:

Map<Integer, Integer> numMap = new HashMap<Integer, Integer>(); 


    boolean checkDuplicates(int val){ 
     if(numMap.containsKey(val)){ 
      return false; 
     } 
     else{ 
      numMap.put(val, 1); 
      return true; 
     } 
    } 


    boolean checkBST(Node root) { 
     if(root.left == null && root.right == null){ 
      return (true && checkDuplicates(root.data)); 
     } 
     else if(root.left.data > root.data || root.right.data < root.data){ 
      return false; 
     } 
     else{ 
      if(root.left == null){ 
       return (checkBST(root.right) && checkDuplicates(root.data)); 
      } 
      else if(root.right == null){ 
       return (checkBST(root.left) && checkDuplicates(root.data)); 
      } 
      else{ 
       return (checkBST(root.left) && checkBST(root.right) && checkDuplicates(root.data)); 
      } 
     } 
    } 

Voici un lien vers le problème de HackerRank: https://www.hackerrank.com/challenges/ctci-is-binary-search-tree

Qu'est-ce que je fais mal/ici donnent sur?

Répondre

3

Chaque noeud dans le sous-arbre doit être plus petit/plus grand que la racine. Vous venez de vérifier la racine du sous-arbre.

Par exemple, ce n'est pas un BST:

 5 
    3  7 
1 6 

Cette condition implique aussi qu'il n'y a pas de doublons, vous ne devez pas vérifier que séparément.

+0

Dans la question, je crois que certains des arbres qu'ils créent contiennent des valeurs en double. J'ai fini par passer quelques cas de test supplémentaires lorsque j'ai vérifié les valeurs en double. Pouvez-vous clarifier la première partie de votre réponse? Je pensais que je vérifiais chaque nœud récursivement –

+0

Ohhhhhh. Je vous remercie. L'exemple éclairci :) –

+0

Je suis confus maintenant quant à la façon d'aborder cela. Dois-je créer une ArrayList et lui ajouter des valeurs lorsque je la traverse et que je vérifie la valeur actuelle? –