Я пишу программу для обхода двоичного поиска tree.Here в мой код:Понимание стека раскручивание в рекурсии (дерево обхода)
Main.java
public class Main {
public static void main(String[] args) {
BinaryTree binaryTree = new BinaryTree();
binaryTree.add(50);
binaryTree.add(40);
binaryTree.add(39);
binaryTree.add(42);
binaryTree.add(41);
binaryTree.add(43);
binaryTree.add(55);
binaryTree.add(65);
binaryTree.add(60);
binaryTree.inOrderTraversal(binaryTree.root);
}
}
Node.java
public class Node {
int data;
Node left;
Node right;
Node parent;
public Node(int d)
{
data = d;
left = null;
right = null;
}
}
BinaryTree.java
public class BinaryTree {
Node root = null;
public void add(int d)
{
Node newNode = new Node(d);
if(root!=null)
{
Node futureParent = root;
while(true)
{
if(newNode.data < futureParent.data) //going left
{
if(futureParent.left == null)
{
futureParent.left = newNode;
newNode.parent = futureParent;
break;
}
futureParent = futureParent.left;
}
else
{
if(futureParent.right == null)
{
futureParent.right = newNode;
newNode.parent = futureParent;
break;
}
futureParent = futureParent.right;
}
}
}
else
{
root = newNode;
}
}
public void inOrderTraversal(Node node)
{
if(node!=null)
{
inOrderTraversal(node.left);
System.out.println(node.data);
inOrderTraversal(node.right);
}
}
}
Я понимаю процесс добавления отлично, но у меня проблемы с пониманием обхода. Теперь дерево я работаю, для лучшего ведения заключается в следующем:
Первое утверждение в функции визитов в inOrderTraversal()
50,40 затем 39 и, наконец, попадает нуль делает, если условие ложно, после чего 39 печатается и выполняется поиск подходящего ребенка. После этого первый оператор прекращает выполнение, и стек разматывается для 2-го и 3-го операторов (inOrderTraversal(node.right)
и print(node.data)
), что приводит к печати 40 и пересечению до 41, которая является той частью, которую я не понимаю, т.е. как компилятор перезапускает оператор 1 (inOrderTraversal(node.left)
) после того, как он прекратил выполнение, как только в стеке будут свежие вещи.
Вы можете использовать отладчик вашей IDE, чтобы проверить, как создаются стеки, и чтобы убедиться, что каждая из них имеет свою собственную копию. – Slimu