我正在尝试使用广度优先插入方式生成树。 我试图通过以广度优先顺序生成包含树中所有元素的List来完成此操作。然后在我的insertNode方法中,我检查节点是否需要带有一个名为needsChildren()的方法的子节点,如果是,我将添加我插入到最左边点的树中的节点。
如果我打电话的话 insertNode(10) insertNode(8) insertNode(20) insertNode(5) insertNode(29) insertNode(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);
}
}
}
答案 0 :(得分:1)
我经过一些调试后设法找到了我的错误。这个问题出在我的insertNode()方法中。
我正在生成我在树中插入两次的firstNode。
这是因为我致电
if(root==null){
root= new TreeNode<T>(d);
}
对于第一个节点,但之后没有突破该方法,而是调用其余代码,然后生成第一个节点两次。一个简单的if语句解决了这个问题。已解决的代码如下所示。
public void insertNode(T d) {
if(root==null){
root= new TreeNode<T>(d);
size+=1;
}
else if(root!=null){
genList(root);
if(needsChildren(nodesThatNeedChildren.get(0))){
if(nodesThatNeedChildren.get(0).left==null){
nodesThatNeedChildren.get(0).left= new TreeNode<T>(d);
size+=1;
}else{
nodesThatNeedChildren.get(0).right= new TreeNode<T>(d);
size+=1;
}
}else{
while(!needsChildren(nodesThatNeedChildren.get(0))){
nodesThatNeedChildren.remove(0);
}
if(nodesThatNeedChildren.get(0).left==null){
nodesThatNeedChildren.get(0).left = new TreeNode<T>(d);
size+=1;
}else{
nodesThatNeedChildren.get(0).right = new TreeNode<T>(d);
size+=1;
}
}
}
}