2014-12-04 85 views
0

我创建了一个二进制搜索树类,我跟踪了一些youtube视频。问题是,从我所知道的情况来看,我的代码和我遵循的指南完全一样。问题是,当我运行我的main()方法时,没有任何反应。没有编译或运行时错误,程序根本就什么都不做。应该发生的是,如果我使用遍历方法,它应该使用toString()方法来打印出这些键的一些键和值,或者如果我使用findNode()方法,它应该提供一个节点的值。我希望有人可以检查我的代码,看看他们是否可以发现任何逻辑错误,因为我花了很长时间检查和重新检查我的代码,我似乎无法发现它。Java二进制搜索树在运行时不打印

这里是我的主要方法的代码:

public class BinarySearchTreeAss2 { 
    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     BinarySearchTree myTree = new BinarySearchTree(); 

     myTree.addNode(50, 1); 
     myTree.addNode(25, 2); 
     myTree.addNode(15, 3); 
     myTree.addNode(30, 4); 
     myTree.addNode(75, 5); 
     myTree.addNode(80, 6); 

     myTree.inOrderTraversal(myTree.root); 
     System.out.println("\n\n"); 

     myTree.preOrderTraversal(myTree.root); 
     System.out.println("\n\n"); 

     myTree.postOrderTraversal(myTree.root); 
     System.out.println(myTree.findNode(30)); 
    } 
} 

而对于二叉搜索树类的代码:

public class BinarySearchTree { 
    Node root; 

    public void addNode(int key, int value) { 
     Node newNode = new Node(key, value); 
     if(root == null) { 
      root = newNode; 
     } else { 
      Node focusNode = root; 
      Node parent; 
      while(true) { 
       parent = focusNode; 
       if(key < focusNode.key) { 
        focusNode = focusNode.leftChild; 
        if(focusNode == null) { 
         parent.leftChild = newNode; 
         return; 
        } else { 
         focusNode = focusNode.rightChild; 
         if(focusNode == null) { 
          parent.rightChild = newNode; 
          return; 
         } 
        } 
       } 
      } 
     } 
    } 

    public void inOrderTraversal(Node focusNode) { 
     if(focusNode != null) { 
      inOrderTraversal(focusNode.leftChild); 
      System.out.println(focusNode); 
      inOrderTraversal(focusNode.rightChild); 
     } 
    } 

    public void preOrderTraversal(Node focusNode) { 
     if(focusNode != null) { 
      System.out.println(focusNode); 
      preOrderTraversal(focusNode.leftChild); 
      preOrderTraversal(focusNode.rightChild); 
     } 
    } 

    public void postOrderTraversal(Node focusNode) { 
     if(focusNode != null) { 
      postOrderTraversal(focusNode.leftChild); 
      postOrderTraversal(focusNode.rightChild); 
      System.out.println(focusNode); 
     } 
    } 

    public Node findNode(int key) { 
     Node focusNode = root; 
     while(focusNode.key != key) { 
      if(key < focusNode.key) { 
       focusNode = focusNode.leftChild; 
      } else { 
       focusNode = focusNode.rightChild; 
      } 
      if(focusNode == null) { 
       return null; 
      } 
     } 
     return focusNode; 
    } 
} 

class Node { 
    int key; 
    int value; 

    Node leftChild; 
    Node rightChild; 

    Node(int key, int value) { 
     this.key = key; 
     this.value = value; 
    } 

    @Override 
    public String toString() { 
     return value + " has the key " + key; 
    } 
} 

回答

1

您的if语句括号这导致程序搞砸进入无限循环。

if (key < focusNode.key) { 
    focusNode = focusNode.leftChild; 

    if (focusNode == null) { 
     parent.leftChild = newNode; 
     return; 
    } 

    else { 
     focusNode = focusNode.rightChild; 

     if (focusNode == null) { 
      parent.rightChild = newNode; 
      return; 
     } 
    } 
} 

如果关键是小于focusNode.key然后向左走,否则往右走,所以它应该是

if (key < focusNode.key) { 
    focusNode = focusNode.leftChild; 

    if (focusNode == null) { 
     parent.leftChild = newNode; 
     return; 
    } 
} else { 
    focusNode = focusNode.rightChild; 

    if (focusNode == null) { 
     parent.rightChild = newNode; 
     return; 
    } 
}