l'insertion de nœuds dans un arbre binaire en java question
im venant du c++ à java et je suis confus sur les arbres binaires avec java. est la seule façon d'avoir une classe de Nœud est de faire un intérieur de classe statique? tous les exemples que je vois cela. Cependant, la voie im faire c'est que j'ai une classe de nœud et un binarytree classe utilise cette classe de nœud. mais je reçois un message d'erreur lorsque j'essaie de l'insérer dans l'arbre après la deuxième insertion. j'obtiens une exception à cette ligne if(dataIn <= nodeIn.getLeft().getData()){
Je suis confus quant à ce que j'ai fait de mal.... voici mon code pour insérer que j'ai. merci d'avance..
public void insert(int dataIn){
root = insert(root, dataIn);
}
private Node insert(Node nodeIn, int dataIn){
if(nodeIn==null){
nodeIn = new Node(null, null, dataIn);
}else{
if(dataIn <= nodeIn.getLeft().getData()){
nodeIn.setLeft(insert(nodeIn.getLeft(), dataIn));
}else{
nodeIn.setRight(insert(nodeIn.getRight(), dataIn));
}
}
return nodeIn;
}
Veuillez indiquer l'exception que vous obtenez, pas seulement lorsque vous êtes à l'obtenir.
ici est l'exception im obtenir Exception dans le thread "main" java.lang.NullPointerException à l'arbre.BinaryTree.insert(BinaryTree.java:22) sur l'arbre.BinaryTree.insert(BinaryTree.java:15) au conducteur.Le pilote.principale(Pilote.java:16)
ici est l'exception im obtenir Exception dans le thread "main" java.lang.NullPointerException à l'arbre.BinaryTree.insert(BinaryTree.java:22) sur l'arbre.BinaryTree.insert(BinaryTree.java:15) au conducteur.Le pilote.principale(Pilote.java:16)
OriginalL'auteur thunderousNinja | 2011-04-06
Vous devez vous connecter pour publier un commentaire.
Vous devez tester si
nodeIn.getLeft() == null
.Je suis un peu en supposant que getData() retourne un Entier.MAX_VALUE si elle est null. Mais cela semble être. Non, il n'est pas testé avant de questions... vous tentez de le comparer à un int, de sorte que vous obtenez une exception: les valeurs null et les services de renseignements ne peut pas comparer.
oui getData retourne un int
une primitive de type int peut pas être null. Affectation de la valeur null à une primitive déclenche une exception. Il n'est pas de comparer une valeur null à un int, il est de comparer un entier de type int. Le test est getLeft() == null, getLeft().getData() == null. Il est une exception parce qu'il tente d'appeler une méthode sur getLeft() et getLeft() retourne la valeur null.
vous vérifiez si nodeIn est nul, mais vous n'êtes jamais vérifier si nodeIn.getLeft() retourne la valeur null dans votre code ci-dessus.
OriginalL'auteur Ted Hopp
Partie de la raison pour laquelle il est déroutant, c'est que le "Nœud" ne devrait pas être un paramètre à la méthode d'insertion, vous devriez être à l'appel d'une méthode d'insertion défini dans le nœud.
Donc, disons que vous avez la "Racine" de nœud dans votre "code"--appelons ça "rootNode" juste pour être obscur.
Ok, donc votre code à insérer dans l'arbre serait:
Assez facile.
Maintenant de définir cette méthode.
Cela devrait lire beaucoup plus clairement. Je vais frapper "Post" alors je vais le modifier et de comprendre comment facilement lunette que mal, le mal de copie & coller le code.
À la réflexion, je vais le laisser là parce que c'est plus lisible. La meilleure correction que je peux voir, c'est de faire les nœuds d'un tableau, puis vous obtenez:
Mais je ne vais pas remplacer l'original parce que, comme je l'ai dit, c'est plus clair.
Je recommande le refactoring livre pour les plus de cette. Il n'a vraiment aider à simplifier votre code une fois que vous obtenez vraiment OO. Passage d'un objet à une méthode statique (qui n'utilise pas de variables de membre) est un don mort.
Avec plus de considérations sur @ted commentaire et OO--getLeft et getRight ne devrait même pas être un problème. Il n'est ni nécessaire à l'extérieur de l'abstraction.
En général, ce que vous avez probablement besoin de ces méthodes de Nœud:
et peut-être
Ensuite, vous n'avez même pas besoin d'exposer que c'est un arbre que vous traitez avec--beter OO abstraction.
getLeft()
etgetRight()
, je vous suggère de nommer les variables d'instanceleft
etright
au lieu delower
ethigher
.Ouais @ted, je suis d'accord, mais les noms n'ont pas d'importance-mais puisque c'est codé en dur à faire, des valeurs numériques, j'ai pensé que, pour les besoins de la démonstration explicite match entre > et la hausse a été de mieux qu'un quazi-implicite match entre > et de "Gauche" ou "Droite", mais l'arbre de la terminologie est bien connu de sorte que gauche/droite est fine.
OriginalL'auteur Bill K
Pas.
Le Nœud de la classe n'a pas besoin d'être un intérieur ou une classe imbriquée. (À strictement parler, un "statique intérieure" de la classe est une classe imbriquée.)
Cependant, seulement un intérieur ou une classe imbriquée peut être
private
. Si votreNode
classe est une classe ordinaire vous exposer les détails de mise en œuvre de (au moins) d'autres classes du même package. C'est une mauvaise idée ... et qui explique pourquoi vous voyez l'Node
classe déclarée de la façon dont il est.OriginalL'auteur Stephen C
vous pouvez utiliser le code ci-dessous pour effacer de votre compréhension. La plupart du temps nous ne pas utiliser de toute autre classe, tout peut être fait à l'intérieur d'un seul Nœud de la classe elle-même. voici un exemple très simple qui, je crois, pourrait être utile... Aussi quand je vois que vous avez deux méthodes dans lequel vous avez fourni seulement des données plutôt que de la racine. Croyez-moi il vaut mieux avoir de la racine de votre classe principale. raisonnement que nous avons à portée de main, où jamais nous avons besoin de cache.
}
directement appeler cette méthode à partir de la classe où vous avez initialisé. voici un exemple de plz vérifier..
OriginalL'auteur Vrajendra Singh Mandloi
Au lieu de:
... vous voulez:
Vous avez besoin de comparer la valeur qui doit être inséré avec la valeur du nœud actuel.
J'ai changé le
<=
signe à un<
signe, de sorte que les doublons sont évités.De sorte que votre code refactoring est:
OriginalL'auteur David
En fait, pour un arbre binaire il n'est pas nécessaire de vérifier si l'insertion d'élément est soit supérieure ou gauche du nœud parent. Je pense qu'il n'est pas nécessaire de vérifier ces conditions. Nous devons prendre l'entrée de l'utilisateur s'insérer à droite ou à gauche.
OriginalL'auteur
OriginalL'auteur user2710322
Toutes vos solutions ne permettent pas de prendre en accoount qu'arriverait-il si le nœud doit être insérée dans le milieu de l'arbre. Vous êtes en supposant qu'il sera également plus petit ou plus grand. Lorsque vous insérez quelque chose dans le milieu de l'arbre, puis vous vous rendrez compte que l'opération devient plus complexe.
OriginalL'auteur ProgrammerForNow