1
votes

Ma vérification pour savoir si un graphique est un arbre binaire renvoie toujours faux

J'ai cette question qui est de niveau moyen et je ne pouvais même pas penser à la façon de résoudre ce problème, ma solution pourrait être excessive car je n'ai aucune idée de la façon de parcourir un tas de nombres dans un tableau pour vérifier s'il s'agit d'un arbre binaire ou pas. Le programme renvoie toujours faux quoi qu'il arrive

Si vous avez une meilleure réponse à la question, ce serait parfait

Demandez à la fonction TreeConstructor(strArr) prendre le tableau de chaînes stockées dans strArr , qui contiendra des paires d'entiers au format suivant (i1, i2) où i1 représente un enfant un nœud dans un arbre et le deuxième entier i2 signifie qu'il est le parent de i1. Par exemple, si strArr vaut ["(1,2)", "(2,4)", "(7,2)"]

function TreeConstructorTwo(strArr) { 
  // code goes here  
  startValueFromList = convertListToNumber(strArr, 0)
  // Parent Node here
  startParentNode = startValueFromList[1];
  // Child Node here
  startChildNode = startValueFromList[0];
  // Add parent Node and childNode
  node = new Node(startParentNode);
  node.insert(startChildNode);
  // Loop through the entire array
  for (i = 1; i < strArr.length; i++) {
    myListValue = convertListToNumber(strArr, i);
    console.log(myListValue.length)
    // Loop the "12" in the string and convert it to a number
    for (j = 0; j < myListValue.length; j++) {
       node.insert(myListValue[j])
    }
    parentNode = Number(myListValue[0])
  }
  // Check if the BST is valid or not
  return node.isValidBST(node)
}

// keep this function call here 
console.log(TreeConstructorTwo(["(1,2)", "(2,4)", "(5,7)", "(7,2)", "(9,5)"]));

que vous pouvez voir forme un arbre binaire approprié. Votre programme doit, dans ce cas, renvoyer la chaîne true car un arbre binaire valide peut être formé. Si un binaire correct ne peut pas être formé avec les paires d'entiers, renvoyez la chaîne false. Tous les entiers de l'arborescence seront uniques, ce qui signifie qu'il ne peut y avoir qu'un seul nœud dans l'arborescence avec la valeur entière donnée

Exemples

class Node {
  // The constructor
  constructor(value) {
    this.value = value;
    this.left = null;
    this.right = null;
  }
  // Basic insert node
  insert(value) {
    let currentNode = this;
    while (true) {
      if (value < currentNode.value) {
        if (currentNode.left === null) {
          currentNode.left = new Node(value);
          break;
        } else {
          currentNode = currentNode.left;
        }
      } else {
        if (currentNode.right === null) {
          currentNode.right = new Node(value);
          break;
        } else {
          currentNode = currentNode.right;
        }
      }
    }
    return currentNode
  }
    // check if BST is valid or not
    isValidBST(node, min = null, max = null) {
    if (!node) return true;
    if (max !== null && node.value >= max) {
      return false;
    }
    if (min !== null && node.value <= min) {
      return false;
    }
    const leftSide = this.isValidBST(node.left, min, node.value);
    const rightSide = this.isValidBST(node.right, node.value, max);
    return leftSide && rightSide;
  }
}

// Convert the strings to a number 
function convertListToNumber(str, i) {
  return str[i].split('(').join('').split(')').join('').split(',').join('')
}

Je suis sorti avec une tentative, mais il retourne toujours faux. Très probablement, mon code est excessif.

input: ["(1,2)", "(2,4)", "(5,7)", "(7,2)", "(9,5)"]
output: true


input ["(1,2)", "(1,3)"]
output: false

C'est la fonction principale

    4 
   /
  2
 / \
1   7


8 commentaires

Lisezericlippert.com/2014/03/05/how-to-debug-small-programs pourobtenir des conseils sur le débogage de votre code.


Avez-vous même besoin de construire l'arbre pour le valider? Concentrez-vous sur les propriétés qu'un BST doit présenter (nombre d'enfants, etc.). L'entrée ne spécifie pas ce qui reste et ce qui est juste, donc tant que vous avez le bon nombre, vous pouvez les organiser valablement. L'arbre n'a pas besoin d'être complet ou équilibré.


Vous avez 1) une question, 2) quelques exemples, 3) du code. Ce qui vous manque, c'est un algorithme.


@PartyLich avez-vous des suggestions sur la façon de valider? ne peut penser à aucun, d'où pourquoi j'ai fait gauche et droite probablement pour valider l'arbre


@ user3386109 Je ne suis pas intelligent, c'est pourquoi j'ai demandé des conseils :)


Mon point était que vous avez sauté la partie la plus importante du processus. Vous devez concevoir un algorithme et présenter cet algorithme dans la question. Ensuite, nous pouvons discuter de l'algorithme. Actuellement, je devrais faire de l'ingénierie inverse du code pour essayer de deviner quel est votre algorithme.


Qu'est-ce qui constitue un arbre binaire «propre»? Je veux dire, je peux penser à quelques choses qui en feraient évidemment pas un arbre binaire: par exemple: un nœud qui a plus d'un parent; plus d'un nœud qui n'a pas de parent; un cycle de n'importe quelle longueur; ou un nœud qui a 3 enfants ou plus; Mais il y a des cas qui ne sont pas aussi clairs. Que faire si un nœud n'a qu'un seul enfant? Est-ce toujours bon? Et s'il n'y a pas du tout de nœuds? Est-ce que c'est «correct»? est-ce "valide"? Ces termes ont besoin de définitions. (Props à @trincot qui a fait une liste décente de critères d'arbre binaire valides - mais qu'est-ce qui est "correct")


Oui, tout cela est correct par définition de BT. Ce n'est pas du tout ambigu. «Proper» et «valid» ont déjà des définitions simples en anglais que nous pouvons utiliser. Ce n'est pas «correct», c'est-à-dire «invalide», s'il a des propriétés qui en font PAS un arbre binaire.


3 Réponses :


3
votes

Vous semblez avoir mal compris la mission. La fonction doit renvoyer true lorsque l'arbre représenté est un arbre binaire, pas nécessairement un arbre de recherche binaire.

Votre code crée un arbre à partir du premier élément, puis prend n'importe quel nœud suivant pour l'insérer dans cet arbre en conservant la propriété de recherche binaire, sans prendre en compte le fait que la paire de l'entrée exige que le premier soit un enfant direct du second . (Votre variable parentNode n'est utilisée pour rien)

Au lieu de cela, vous devez simplement regarder les relations enfant-parent qui sont données dans l'entrée comme représentant des arêtes et utiliser ces informations pour créer le graphique. Enfin, vous devez vérifier que ce graphique représente un arbre binaire . Pensez à quelles sont les caractéristiques distinctives d'un arbre binaire et comment les vérifier.

NB: Je nommerais la fonction avec une lettre minuscule initiale car il est courant de réserver les lettres majuscules initiales pour les noms de classe.


3 commentaires

L'absence de nœuds (et par conséquent pas d'arêtes) est-elle toujours un arbre binaire valide? Certains pourraient dire oui. Vos critères «il y a exactement un nœud qui n'a pas de parent» pourraient devoir être légèrement modifiés.


Correct: reformulé.


J'aurais aimé pouvoir résoudre le problème comme toi @trincot



1
votes

Récemment, j'ai fait la solution pour cette tâche, vérifiez ma solution ci-dessous:

const isBinaryTree = (array) => {
  const getChildrenNode = (node) => node.slice(1, 2);
  const childrenNodes = array.map(x => getChildrenNode(x));
  const isChildrenNodesIsUnique = (array) => array.length === new Set(array).size;
  
  return isChildrenNodesIsUnique(childrenNodes);
};


console.log(isBinaryTree(["(1,2)", "(2,4)", "(5,7)", "(7,2)", "(9,5)"]));
console.log(isBinaryTree(["(1,2)", "(1,3)"]));


1 commentaires

ça ne marche pas pour ["(1,2)", "(3,2)", "(2,12)", "(5,2)"]



0
votes
function isBinaryTree(tree) {

    isBinary = 0; 
  
    childs = tree.map(node => {
        return node.substr(1, 1)
    });
  
    parents = tree.map(node => {
        return node.substr(3, 1)
    });
    
    parents.map(parent => {
        if (!childs.includes(parent))
            isBinary++;
    });
  
    isBinary = isBinary == 1 ? true : false;
  
    return isBinary;

}

0 commentaires