java中二叉搜索树的级顺序遍历

java中二叉搜索树的级顺序遍历,java,binary-search-tree,binaryfiles,tree-traversal,Java,Binary Search Tree,Binaryfiles,Tree Traversal,我已经对我的二叉搜索树进行了4次不同的遍历。我被困在最后一个层次顺序遍历中,我似乎无法找到正确的方法 主要的问题是,我不知道如何一次只搜索一个级别,我只知道如何搜索整个左子树或整个右子树 private void preOrder(BinaryNode<AnyType> t ) { if(isEmpty()){ System.out.println("Empty"); } if(t != null) {

我已经对我的二叉搜索树进行了4次不同的遍历。我被困在最后一个层次顺序遍历中,我似乎无法找到正确的方法

主要的问题是,我不知道如何一次只搜索一个级别,我只知道如何搜索整个左子树或整个右子树

private void preOrder(BinaryNode<AnyType> t )
    {
        if(isEmpty()){
            System.out.println("Empty");
        }
        if(t != null) {
            System.out.println(t.element);
            preOrder(t.left);
            preOrder(t.right);
        }
    }

    private void postOrder(BinaryNode<AnyType> t){

        if(isEmpty()){
            System.out.println("Empty");
        }
        if (t != null) {
            postOrder(t.left);
            postOrder(t.right);
            System.out.println(t.element);
        }
    }

    private void inOrder(BinaryNode<AnyType> t)
    {
        if(isEmpty()){
            System.out.println("Empty");
        }

        if (t != null) {
            inOrder(t.left);
            System.out.println(t.element);
            inOrder(t.right);
        }
    }

    private void levelOrder(BinaryNode<AnyType> t, int level)
    {
        if(isEmpty()){
            System.out.println("Empty");
        }

        if(height(t) == 2) {
            System.out.println(t.element);

        }else if(height(t) > 1){
            levelOrder(t.left, level );
            levelOrder(t.right, level );
        }

    }
private void预订单(BinaryNode t)
{
if(isEmpty()){
System.out.println(“空”);
}
如果(t!=null){
系统输出打印LN(t元素);
前序(t.left);
前序(t.右);
}
}
专用无效邮政订单(BinaryNode t){
if(isEmpty()){
System.out.println(“空”);
}
如果(t!=null){
后序(t.left);
邮购(右);
系统输出打印LN(t元素);
}
}
私有void索引(二进制节点t)
{
if(isEmpty()){
System.out.println(“空”);
}
如果(t!=null){
顺序(t左);
系统输出打印LN(t元素);
顺序(t.右);
}
}
私有void levelOrder(二进制节点t,int级别)
{
if(isEmpty()){
System.out.println(“空”);
}
如果(高度(t)==2){
系统输出打印LN(t元素);
}否则(高度(t)>1){
水平顺序(t.左,水平);
levelOrder(t.右,level);
}
}

您的方法看起来像DFS方法,但可能不遵循该方法。 尝试在此处使用队列,它将帮助您正确遍历。 因为它将遵循BFS方法,所以您可以逐级遍历。
先添加左节点,然后添加右节点,并按照顺序进行操作。

将整个搜索视为一系列“轮”,每个级别一个“轮”

在每一轮中:

- initialize a "next round" list of nodes to empty
- process a prepared list of nodes (the ones that are at that level and thus to be searched in that round) whereby for each node :
  - do the actual comparison
  - add all the node's child nodes to the "next round" list
使用仅填充根节点的“下一轮”列表启动流程


重复此操作,直到“下一轮”节点列表显示为空,或者您找到了要查找的节点。

我就是这样做的

private void levelOrder(BinaryNode root) {
        if (root == null) {
            return;
        }

        Queue<BinaryNode> q = new LinkedList<>();

        // Pushing root node into the queue.
        q.add(root);

        // Executing loop till queue becomes
        // empty
        while (!q.isEmpty()) {

            BinaryNode curr = q.poll();
            System.out.print(curr.element + " ");

            // Pushing left child current node
                if (curr.left != null) {
                    q.add(curr.left);
                }

                // Pushing right child current node
                if (curr.right != null) {
                    q.add(curr.right);
                }
            }
    }
private void levelOrder(二进制节点根){
if(root==null){
返回;
}
队列q=新的LinkedList();
//正在将根节点推送到队列中。
q、 添加(根);
//执行循环直到队列变为
//空的
而(!q.isEmpty()){
BinaryNode curr=q.poll();
系统输出打印(curr.element+“”);
//左推子节点当前节点
如果(当前左侧!=null){
q、 添加(当前左侧);
}
//正在推右子节点当前节点
如果(当前右侧!=null){
q、 添加(当前右侧);
}
}
}
请发帖。删除不相关的代码(像其他遍历一样),并添加运行它所需的内容。还包括测试数据。