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的次数。请仅对实际答案使用“发布答案”按钮。你应该在你原来的帖子中添加更多信息。