Java 宽度优先显示级别中的问题

Java 宽度优先显示级别中的问题,java,data-structures,tree,breadth-first-search,Java,Data Structures,Tree,Breadth First Search,我想使用树格式插入导入,它记录数据和级别 import java.util.LinkedList; import java.util.Queue; class Node { public int iData; // data item (key) public double dData; // data item public Node leftChild; // this node's left child public Node rightChild; //

我想使用树格式插入导入,它记录数据和级别

import java.util.LinkedList;
import java.util.Queue;

class Node {
    public int iData; // data item (key)
    public double dData; // data item
    public Node leftChild; // this node's left child
    public Node rightChild; // this node's right child
    public int level;

    public void displayNode() // display ourself
    {
        System.out.print('{');
        System.out.print(level);
        System.out.print(", ");
        System.out.print(iData);
        System.out.print(", ");
        System.out.print(dData);
        System.out.print("} ");
        System.out.println(" ");
    }
} // end class Node
// //////////////////////////////////////////////////////////////

class Tree {
private Node root; // first node of tree

// -------------------------------------------------------------
public Tree() // constructor
{
    root = null;
} // no nodes in tree yet
// -------------------------------------------------------------

public void insert(int id, double dd) {
    Node newNode = new Node(); // make new node
    newNode.iData = id; // insert data
    newNode.dData = dd;
    if (root == null) // no node in root
        root = newNode;
    else // root occupied
    {
        Node current = root; // start at root
        Node parent;
        while (true) // (exits internally)
        {
            parent = current;
            if (id < current.iData) // go left?
            {
                current = current.leftChild;
                if (current == null) // if end of the line,
                { // insert on left
                    parent.leftChild = newNode;
                    return;
                }
            } // end if go left
            else // or go right?
            {
                current = current.rightChild;
                if (current == null) // if end of the line
                { // insert on right
                    parent.rightChild = newNode;
                    return;
                }
            } // end else go right
        } // end while
    } // end else not root
} // end insert()
// -------------------------------------------------------------

public void breadthFirstDisplay() {
    Queue newQueue = new LinkedList();
    newQueue.add(root);
    while (!newQueue.isEmpty()){
        Node theNode = (Node) newQueue.remove();
        theNode.displayNode();
        if (theNode.leftChild != null) {
            newQueue.add(theNode.leftChild);
            theNode.level ++;
        }
        if (theNode.rightChild != null) {
            newQueue.add(theNode.rightChild);
            theNode.level ++;
        }
    }
}
// -------------------------------------------------------------
} // end class Tree
// //////////////////////////////////////////////////////////////

class TreeApp {
public static void main(String[] args){
    Tree theTree = new Tree();

    theTree.insert(50, 1.5);
    theTree.insert(25, 1.2);
    theTree.insert(75, 1.7);
    theTree.insert(12, 1.5);
    theTree.insert(37, 1.2);
    theTree.insert(43, 1.7);
    theTree.insert(30, 1.5);
    theTree.insert(33, 1.2);
    theTree.insert(87, 1.7);
    theTree.insert(93, 1.5);
    theTree.insert(97, 1.5);

    theTree.breadthFirstDisplay();

}// -------------------------------------------------------------
} // end class TreeApp
// //////////////////////////////////////////////////////////////
为什么级别将全部显示在0中

很抱歉,也许我的级别问题不清楚。 等级应该是一棵树需要移动多少次。 我的预期结果是:

输出:

0, 50, 1.5  
0, 25, 1.2  
0, 75, 1.7  
0, 12, 1.5  
0, 37, 1.2  
0, 87, 1.7  
0, 30, 1.5  
0, 43, 1.7  
0, 93, 1.5  
0, 33, 1.2  
0, 97, 1.5  
0, 50, 1.5  
1, 25, 1.2  
1, 75, 1.7  
2, 12, 1.5  
2, 37, 1.2  
2, 87, 1.7  
3, 30, 1.5  
3, 43, 1.7  
3, 93, 1.5  
4, 33, 1.2  
4, 97, 1.5  

移动
theNode.displayNode()从开始while循环到结束(在条件之后),应该是显示级别,但我不确定,如果您的实现是正确的-我将不得不进一步研究它


编辑:我不确定,如果这个,你想通过
级别
实现的是节点的直接子节点的数量-如果是,那么它将显示它。但是如果
level
应该是info,您离根有多远,那么最好将计算级别移动到添加元素的主循环,并在那里增加它。

我认为您在更改级别之前正在显示节点:

// instead of this in your code
Node theNode = (Node) newQueue.remove();
theNode.displayNode();
if (theNode.leftChild != null) {
    newQueue.add(theNode.leftChild);
    theNode.level ++;
}
if (theNode.rightChild != null) {
    newQueue.add(theNode.rightChild);
    theNode.level ++;
}

// do this
Node theNode = (Node) newQueue.remove();
if (theNode.leftChild != null) {
    newQueue.add(theNode.leftChild);
    theNode.level ++;
}
if (theNode.rightChild != null) {
    newQueue.add(theNode.rightChild);
    theNode.level ++;
}
theNode.displayNode(); // move display here

您可以使用以下方法:

public void breadthFirstDisplay() {
    Queue newQueue = new LinkedList();
    newQueue.add(root);
    while (!newQueue.isEmpty()){
        Node theNode = (Node) newQueue.remove();
        theNode.displayNode();
        if (theNode.leftChild != null) {
            newQueue.add(theNode.leftChild);
            theNode.level ++;
        }
        if (theNode.rightChild != null) {
            newQueue.add(theNode.rightChild);
            theNode.level ++;
        }
    }
}
您正在调用
theNode.displayNode()使用node.level++增加级别之前进行编码>

尝试移动
theNode.displayNode()
循环的末尾,如下所示:

public void breadthFirstDisplay() {
    Queue newQueue = new LinkedList();
    newQueue.add(root);
    while (!newQueue.isEmpty()){
        Node theNode = (Node) newQueue.remove();
        // theNode.displayNode();
        if (theNode.leftChild != null) {
            newQueue.add(theNode.leftChild);
            theNode.level ++;
        }
        if (theNode.rightChild != null) {
            newQueue.add(theNode.rightChild);
            theNode.level ++;
        }
        theNode.displayNode(); // moved here
    }
}

我最初的期望是计算一棵树需要移动多少次,而不是使用if的次数。

我最初的期望是计算一棵树需要移动多少次,而不是使用if的次数。我最初的期望是计算一棵树需要移动多少次,但不是使用if的次数。我最初的期望是计算一棵树中需要移动的次数,但不是使用if的次数。请仅对实际答案使用“发布答案”按钮。你应该在你原来的帖子中添加更多信息。