Java 按顺序遍历进入无限循环,只打印第一个节点

Java 按顺序遍历进入无限循环,只打印第一个节点,java,algorithm,tree,binary-search-tree,inorder,Java,Algorithm,Tree,Binary Search Tree,Inorder,我试图编写一段简单的代码,用按顺序遍历二叉搜索树。我能够完美地更正插入代码,因为调试器显示了一棵与我想要的完全相同的树。但是我的递归遍历没有给出正确的结果。下面是我的调试器的屏幕截图: 左子树后跟右子树 对应于以下可视化树: 它只打印无限循环中的第一个元素(39),而不是打印所有节点。 这是我的密码: Main.java public class Main { public static void main(String[] args) { BinaryTree binaryTre

我试图编写一段简单的代码,用
按顺序遍历二叉搜索树。我能够完美地更正插入代码,因为调试器显示了一棵与我想要的完全相同的树。但是我的递归遍历没有给出正确的结果。下面是我的调试器的屏幕截图:

左子树后跟右子树

对应于以下可视化树:

它只打印无限循环中的第一个元素(39),而不是打印所有节点。 这是我的密码: 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);
}
}
public class Node {
int data;
Node left;
Node right;
Node parent;


public Node(int d)
 {
   data = d;
   left = null;
   right = null;
 }
}
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)
{
    while(node!=null)
    {
    inOrderTraversal(node.left);
    System.out.println(node.data);
    inOrderTraversal(node.right);
    }
}
}
Node.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);
}
}
public class Node {
int data;
Node left;
Node right;
Node parent;


public Node(int d)
 {
   data = d;
   left = null;
   right = null;
 }
}
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)
{
    while(node!=null)
    {
    inOrderTraversal(node.left);
    System.out.println(node.data);
    inOrderTraversal(node.right);
    }
}
}
BinaryTree.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);
}
}
public class Node {
int data;
Node left;
Node right;
Node parent;


public Node(int d)
 {
   data = d;
   left = null;
   right = null;
 }
}
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)
{
    while(node!=null)
    {
    inOrderTraversal(node.left);
    System.out.println(node.data);
    inOrderTraversal(node.right);
    }
}
}
公共类二进制树{
节点根=空;
公共无效添加(int d)
{
Node newNode=新节点(d);
if(root!=null)
{
节点未来父节点=根节点;
while(true)
{
if(newNode.data
在inOrderTraversal()中不需要while()循环。这是一个递归调用。它造成了一个无休止的循环

但是,您确实需要一些东西来停止递归。仅当节点不为null时才递归

public void inOrderTraversal(Node node) {
    if(node==null) return;

    inOrderTraversal(node.left);
    System.out.println(node.value);
    inOrderTraversal(node.right);
}

当您使用递归时,您应该记住基本情况、简化问题和一般解决方案

这里的基本情况是:如果node==null,则停止递归。 减少的问题是:应该能够访问任何单个左/父/右节点 一般的解决方案是:访问左侧、访问节点、访问右侧

因此,您的代码应该是:

public void lnrTraverse(Node node) {
    //if (node == null) return; //This is not needed. Valid only if it an empty tree
    if (node.left != null) {
        lnrTraversal(node.left);
    }
    System.out.println(node);
    if (node.right != null) {
        lnrTraversal(node.right);
    }
}

我试着按照教程来写。我几乎是用同样的方式写的。很抱歉打扰你,你能告诉我为什么while循环适用于他的代码而不适用于我的吗?@zigtones我看到了他的代码,但它没有while循环。你找对地方了吗?我查看了OrderTraverseTree(Node focusNode)中的公共void;有时候,当我陷入困境时,我就是看不见东西。无论如何,非常感谢你帮我摆脱困境。