Une partie est que je dois mettre en œuvre une méthode non récursive d'une traversée d'inondation d'un arbre binaire. Je suis un peu coincé. Voici ce que j'ai jusqu'à présent:
A / \ B C / \ / \ D E F G / \ H I / \ J K
3 Réponses :
Suivre votre code, la boucle tandis que pour la partie Essayez ce code exemple: Stackoverflow Réponse: https://stackoverflow.com/a/12718147/1178781 < / a> p> getleft () code> passe à gauche de l'arborescence, puis sortez.
v code> est maintenant nœud
j code>, qui n'a pas d'enfant droit, donc la boucle suivante tandis que la boucle ne fonctionne pas.
Merci beaucoup, les commentaires m'ont aidé à comprendre comment cela fonctionne encore plus :)
Vous pouvez simplifier grandement le ci-dessus avec une boucle unique tandis que:
Stack<Node> stack = new Stack<>(); Node current = root; while(current != null || !stack.isEmpty()){ if(current != null){ stack.push(current); current = current.left; } else if(!stack.isEmpty()) { current = stack.pop(); process(current); current = current.right; } }
Une autre implémentation de traversée binaire plus simple:
import java.util.Stack; public class BinaryTree { public static void main(String args[]) { Node root = Node.createDummyTree(); Node tnode; //= root; Stack<Node> stack = new Stack<Node>(); if (root != null) { stack.push(root); } while (!stack.isEmpty()) { tnode = stack.pop(); if (tnode != null) { System.out.println(tnode.value); if(tnode.rightNode != null) { stack.push(tnode.rightNode); } if (tnode.leftNode != null) { stack.push(tnode.leftNode); } } } } } class Node { public Node leftNode; public Node rightNode; public String value; Node(String value) { this.value = value; } /** * Construct a dummy binary Tree * A * / \ * B C * / \ / \ * D E F G * / \ / \ / \ / \ * H I J K L M N O * @return */ public static Node createDummyTree(){ Node root = new Node("A"); root.leftNode = new Node("B"); root.rightNode = new Node("C"); Node tnode = root.leftNode; tnode.leftNode = new Node("D"); tnode.rightNode = new Node("E"); Node tempNode = tnode.rightNode; //remember "E" tnode = tnode.leftNode; tnode.leftNode = new Node ("H"); tnode.rightNode = new Node ("I"); tnode = tempNode; tnode.leftNode = new Node ("J"); tnode.rightNode = new Node ("K"); tnode = root.rightNode; tnode.leftNode = new Node("F"); tnode.rightNode = new Node("G"); tempNode = tnode.rightNode; // rememebr "G" tnode = tnode.leftNode; tnode.leftNode = new Node("L"); tnode.rightNode = new Node("M"); tnode = tempNode; tnode.leftNode = new Node("N"); tnode.rightNode = new Node("O"); return root; } }
Il s'agit d'une traversée de pré-commande mais OP fait référence à une traversée en ordre.