【发布时间】:2018-04-09 09:14:56
【问题描述】:
我正在尝试生成具有广度优先插入形式的树。 我试图通过以广度优先顺序生成包含树中所有元素的列表来做到这一点。然后在我的 insertNode 方法中,我使用名为 needsChildren() 的方法检查节点是否需要子节点,如果需要,我将要插入的节点添加到树的最左侧。
如果我打电话 插入节点(10) 插入节点(8) 插入节点(20) 插入节点(5) 插入节点(29) 插入节点(50)
生成的树应该是
10
8 20
5 29 50
等等……
此解决方案不起作用,我不太清楚为什么。我认为我的 generateList 可能无法正常工作,但我检查了最后打印的列表,它似乎是正确的。
有没有更好的方法来做到这一点,或者我的代码中是否存在我找不到的问题。非常感谢任何帮助。
这是我的 TreeNode 类:
private static class TreeNode<T> {
public T data;
public TreeNode<T> left;
public TreeNode<T> right;
public TreeNode(T d) {
data = d;
left = null;
right = null;
}
}
我的 insertNode 方法:
public void insertNode(T d) {
if(root==null){
root= new TreeNode<T>(d);
}
genList(root);
if(needsChildren(nodesThatNeedChildren.get(0))){
if(nodesThatNeedChildren.get(0).left==null){
nodesThatNeedChildren.get(0).left= new TreeNode<T>(d);
}else{
nodesThatNeedChildren.get(0).right= new TreeNode<T>(d);
}
}else{
while(!needsChildren(nodesThatNeedChildren.get(0))){
nodesThatNeedChildren.remove(0);
}
System.out.println(nodesThatNeedChildren.get(0).data);
if(nodesThatNeedChildren.get(0).left==null){
nodesThatNeedChildren.get(0).left = new TreeNode<T>(d);
}else{
nodesThatNeedChildren.get(0).right = new TreeNode<T>(d);
}
}
}
我检查节点是否需要子节点的方法:
public boolean needsChildren(TreeNode<T> node){
if(node.left==null || node.right ==null){
return true;
}
return false;
}
还有我生成树中所有节点列表的方法:
public void genList(TreeNode<T> root) {
//generate new List each time
nodesThatNeedChildren.clear();
nodesThatNeedChildren.add(root);
//generate new Queue each time genList is called
tempQueue.clear();
tempQueue.add(root);
while(!tempQueue.isEmpty()){
TreeNode<T> node = tempQueue.remove(0);
if(node.left != null){
tempQueue.add(node.left);
nodesThatNeedChildren.add(node.left);
}
if(node.right != null){
tempQueue.add(node.right);
nodesThatNeedChildren.add(node.right);
}
}
}
【问题讨论】:
-
如果数据已经处于“广度优先顺序”,那么只需普通插入到树中即可。我想我曾经解决过这个问题,这很好。您确定您的插入方法也适用于普通数据吗?我会先尝试让它工作,可能是一个简单的编程错误。
-
关于您的示例数据的一件事,29 应该在右侧节点上,而不是您所展示的左侧。要搜索 29,任何正常的搜索方法都会直接从 10(根)开始,永远找不到 29。那一定是错误的。
-
@markspace 我需要生成树的顺序如我所示。将每个节点插入到树的每一层的最左边。
标签: java tree breadth-first-search