Java二叉树。按序遍历打印

Java二叉树。按序遍历打印,java,binary-tree,tree-traversal,inorder,Java,Binary Tree,Tree Traversal,Inorder,我在打印二叉树的有序遍历时遇到一些问题。即使在树中插入了许多项,它也只打印了3项 public class BinaryTree { private TreeNode root; private int size; public BinaryTree(){ this.size = 0; } public boolean insert(TreeNode node){ if( root == null)

我在打印二叉树的有序遍历时遇到一些问题。即使在树中插入了许多项,它也只打印了3项

public class BinaryTree {

    private TreeNode root;
    private int size;

    public BinaryTree(){
        this.size = 0;
    }

    public boolean insert(TreeNode node){

        if( root == null)
            root = node;

        else{
            TreeNode parent = null;
            TreeNode current = root;
            while( current != null){
                if( node.getData().getValue().compareTo(current.getData().getValue()) <0){
                    parent = current;
                    current = current.getLeft();
                }
                else if( node.getData().getValue().compareTo(current.getData().getValue()) >0){
                    parent = current;
                    current = current.getRight();
                }
                else
                    return false;

                if(node.getData().getValue().compareTo(parent.getData().getValue()) < 0)
                    parent.setLeft(node);
                else
                    parent.setRight(node);
                }
            }
            size++;
            return true;
        }


    /**
     * 
     */
    public void inOrder(){
        inOrder(root);
    }

    private void inOrder(TreeNode root){
        if( root.getLeft() !=null)
            this.inOrder(root.getLeft());
        System.out.println(root.getData().getValue());

        if( root.getRight() != null)
            this.inOrder(root.getRight());
    }



}
公共类二进制树{
独活根;
私有整数大小;
公共二叉树(){
此值为0.size=0;
}
公共布尔插入(TreeNode节点){
if(root==null)
根=节点;
否则{
TreeNode父节点=null;
TreeNode电流=根;
while(当前!=null){
if(node.getData().getValue().compareTo(current.getData().getValue())0){
父项=当前;
current=current.getRight();
}
其他的
返回false;
if(node.getData().getValue().compareTo(parent.getData().getValue())<0)
setLeft(节点);
其他的
setRight(节点);
}
}
大小++;
返回true;
}
/**
* 
*/
公共无效序(){
顺序(根);
}
私有void索引(树节点根){
if(root.getLeft()!=null)
this.inoorder(root.getLeft());
System.out.println(root.getData().getValue());
if(root.getRight()!=null)
this.inoorder(root.getRight());
}
}

您插入的方法有问题。它找到了要将新元素附加到的正确父节点,但在这个过程中,它会弄乱整个树。您应该将插入代码移出while循环:

public boolean insert(TreeNode node){

    if( root == null)
        root = node;

    else{
        TreeNode parent = null;
        TreeNode current = root;
        while( current != null){
            if( node.getData().getValue().compareTo(current.getData().getValue()) <0){
                parent = current;
                current = current.getLeft();
            }
            else if( node.getData().getValue().compareTo(current.getData().getValue()) >0){
                parent = current;
                current = current.getRight();
            }
            else
                return false;
        }

        if(node.getData().getValue().compareTo(parent.getData().getValue()) < 0)
            parent.setLeft(node);
        else
            parent.setRight(node);
        }

        size++;
        return true;
    }
}
公共布尔插入(TreeNode节点){
if(root==null)
根=节点;
否则{
TreeNode父节点=null;
TreeNode电流=根;
while(当前!=null){
if(node.getData().getValue().compareTo(current.getData().getValue())0){
父项=当前;
current=current.getRight();
}
其他的
返回false;
}
if(node.getData().getValue().compareTo(parent.getData().getValue())<0)
setLeft(节点);
其他的
setRight(节点);
}
大小++;
返回true;
}
}

在插入时,您似乎没有正确地遍历树,以找到新节点的正确位置。现在,您总是在根的一个子级插入,因为插入代码在
while
循环中-它应该在它之后:

公共布尔插入(TreeNode节点){
if(root==null)
根=节点;
否则{
TreeNode父节点=null;
TreeNode电流=根;
while(当前!=null){
if(node.getData().getValue().compareTo(current.getData().getValue())0){
父项=当前;
current=current.getRight();
}
其他的
返回false;
}
if(node.getData().getValue().compareTo(parent.getData().getValue())<0)
setLeft(节点);
其他的
setRight(节点);
}
大小++;
返回true;
}

嘿,伙计们,这里有一个简单的例子。。试试这个。。这对我很有效

public void levelOrderTraversal(Node root){
    Queue<Node> queue = new ArrayDeque<Node>();
    if(root == null) {
        return;
    }
    Node tempNode = root;
    while(tempNode != null) {
        System.out.print(tempNode.data + " ");

        if(tempNode.left != null)   queue.add(tempNode.left);
        if(tempNode.right != null)   queue.add(tempNode.right);

        tempNode = queue.poll();
    }
}
public void levelOrderTraversal(节点根){
Queue Queue=new ArrayDeque();
if(root==null){
返回;
}
Node tempNode=root;
while(tempNode!=null){
System.out.print(tempNode.data+“”);
if(tempNode.left!=null)queue.add(tempNode.left);
if(tempNode.right!=null)queue.add(tempNode.right);
tempNode=queue.poll();
}
}

我想你可以称之为hw。我正在测试二叉树,有序遍历可能是其中一个问题。我只是想复习一下,我强烈建议你不要在类也有一个字段“root”时,使用一个参数“root”的方法。这让事情变得非常混乱。在Justin的评论之后,我认为您应该使用inOrder(..)一个静态方法。它与特定的树实例无关。实际上,顺序方法体似乎很好。也许你应该检查一下你的插入物。
public void levelOrderTraversal(Node root){
    Queue<Node> queue = new ArrayDeque<Node>();
    if(root == null) {
        return;
    }
    Node tempNode = root;
    while(tempNode != null) {
        System.out.print(tempNode.data + " ");

        if(tempNode.left != null)   queue.add(tempNode.left);
        if(tempNode.right != null)   queue.add(tempNode.right);

        tempNode = queue.poll();
    }
}