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 dansstrArr
, 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, sistrArr
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
3 Réponses :
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.
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
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)"]));
ça ne marche pas pour ["(1,2)", "(3,2)", "(2,12)", "(5,2)"]
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; }
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.