猜游戏二进制树Java

时间:2013-04-23 00:53:18

标签: binary-tree

我正在用java创建一个基本上了解各种海洋动物的程序,要求用户考虑动物,然后询问用户问题,直到它准备好猜测。我使用二叉树来做到这一点。这是我现在的代码:

import java.util.Scanner;
public class TwentyQuestions
{
   private static Scanner stdin = new Scanner(System.in);
   public static void main(String[ ] args)
   {
      BTNode<String> root;

      instruct( );
      root = beginningTree( );
      do
         play(root);
      while (query("Shall we play again?"));

      System.out.println("Thanks for teaching me a thing or two.");
      System.out.println ("Here is the tree:");
      root.print(1);
   }

   public static void instruct( )
   {
      System.out.println("Please think of an ocean animal.");
      System.out.println("I will ask some yes/no questions to try to figure out which animal you're thinking of.");
   }


   public static void play(BTNode<String> current)
   {
      while (!current.isLeaf( ))
      {
         if (query(current.getData( )))
            current = current.getLeft( );
         else
            current = current.getRight( );
      }

      System.out.print("My guess is " + current.getData( ) + ". ");
      if (!query("Am I right?"))
         learn(current);
      else
         System.out.println("I knew it all along!");
   }

   public static BTNode<String> beginningTree( )   
   {
      BTNode<String> root;
      BTNode<String> child;
      BTNode<String> child1;
      BTNode<String> child2;
      BTNode<String> child3;
      BTNode<String> child4;
      BTNode<String> child5;
      BTNode<String> child6;
      BTNode<String> child7;
      BTNode<String> child8;
      BTNode<String> child9;
      BTNode<String> child10;
      BTNode<String> child11;
      BTNode<String> child12;
      BTNode<String> child13;
      BTNode<String> child14;

      final String ROOT_QUESTION = "Is it a mammal?";
      final String LEFT_QUESTION = "Is it able to move on land?";
      final String LEFT_QUESTION2 = "Is it a solitary animal?";
      final String RIGHT_QUESTION2 = "Is it larger than a truck?";
      final String RIGHT_QUESTION3 = "Does it have tusks?";
      final String RIGHT_QUESTION = "Does it have any limbs/tentacles?";
      final String LEFT_QUESTION4 = "Does it have more than four limbs/tentacles?";
      final String LEFT_QUESTION5 = "Does it have an exoskeleton?";
      final String LEFT_QUESTION6 = "Does it have claws?";
      final String LEFT_QUESTION7 = "Does it have a long tail?";
      final String RIGHT_QUESTION7 = "Does it have 8 arms?";
      final String RIGHT_QUESTION5 = "Does it have a shell?";
      final String RIGHT_QUESTION4 = "Can it sting?";
      final String LEFT_QUESTION8 = "Is it long and snakelike?";
      final String RIGHT_QUESTION8 = "Is it generally smaller than a car?";
      final String ANIMAL1 = "Seal";
      final String ANIMAL2 = "Sea Lion";
      final String ANIMAL3 = "Walrus";
      final String ANIMAL4 = "Whale";
      final String ANIMAL5 = "Dolphin";
      final String ANIMAL6 = "Shrimp";
      final String ANIMAL7 = "Lobster";
      final String ANIMAL8 = "Crab";
      final String ANIMAL9 = "Jellyfish";
      final String ANIMAL10 = "Octopus";
      final String ANIMAL11 = "Squid";
      final String ANIMAL12 = "Turtle";
      final String ANIMAL13 = "Alligator";
      final String ANIMAL14 = "Eel";
      final String ANIMAL15 = "Stingray";
      final String ANIMAL16 = "Shark";
      final String ANIMAL17 = "Fish";

      // Create the root node with the question “Are you a mammal?”
      root = new BTNode<String>(ROOT_QUESTION, null, null);

      child = new BTNode<String>(LEFT_QUESTION, child2, child14);
      root.setLeft(child);

      child2 = new BTNode<String>(LEFT_QUESTION2,null,child3);
      child2.setLeft(new BTNode<String>(ANIMAL1, null, null));
      child.setLeft(child2);

      child14 = new BTNode<String>(RIGHT_QUESTION2,null,null);
      child14.setLeft(new BTNode<String>(ANIMAL4,null,null));
      child14.setRight(new BTNode<String>(ANIMAL5,null,null));
      child.setRight(child14);

      child3 = new BTNode<String>(RIGHT_QUESTION3, null, null);
      child3.setLeft(new BTNode<String>(ANIMAL3, null, null));
      child3.setRight(new BTNode<String>(ANIMAL2, null, null));
      child.setRight(child3);

      child1 = new BTNode<String>(RIGHT_QUESTION, child4, child8);
      root.setRight(child1);

      child4 = new BTNode<String>(LEFT_QUESTION4,child5,child10);
      child1.setLeft(child4);

      child5 = new BTNode<String>(LEFT_QUESTION5,child6,child8);
      child4.setLeft(child5);

      child6 = new BTNode<String>(LEFT_QUESTION6,child7, null);
      child6.setRight(new BTNode<String>(ANIMAL6,null,null));
      child5.setLeft(child6);

      child7 = new BTNode<String>(LEFT_QUESTION7, null, null);
      child7.setLeft(new BTNode<String>(ANIMAL7,null,null));
      child7.setRight(new BTNode<String>(ANIMAL8,null,null));
      child6.setLeft(child7);

      child8 = new BTNode<String>(RIGHT_QUESTION4,null,child9);
      child8.setLeft(new BTNode<String>(ANIMAL9,null,null));
      child5.setRight(child8);

      child9 = new BTNode<String>(RIGHT_QUESTION7,null,null);
      child9.setLeft(new BTNode<String>(ANIMAL10,null,null));
      child9.setRight(new BTNode<String>(ANIMAL11,null,null));
     child8.setRight(child9);

      child10 = new BTNode<String>(RIGHT_QUESTION5,null,null);
      child10.setLeft(new BTNode<String>(ANIMAL12,null,null));
      child10.setRight(new BTNode<String>(ANIMAL13,null,null));
      child4.setRight(child10);

      child11 = new BTNode<String>(RIGHT_QUESTION4,child12,child13);
      child1.setRight(child11);

      child12 = new BTNode<String>(LEFT_QUESTION8,null,null);
      child12.setLeft(new BTNode<String>(ANIMAL14,null,null));
      child12.setRight(new BTNode<String>(ANIMAL15,null,null));
     child11.setLeft(child12);

      child13 = new BTNode<String>(RIGHT_QUESTION8,null,null);
      child13.setLeft(new BTNode<String>(ANIMAL17,null,null));
      child13.setRight(new BTNode<String>(ANIMAL16,null,null));
      child11.setRight(child13);

      return root;
   }


   public static void learn(BTNode<String> current)

   {
      String guessAnimal;   // The animal that was just guessed
      String correctAnimal; // The animal that the user was thinking of
      String newQuestion;   // A question to distinguish the two animals

      // Set Strings for the guessed animal, correct animal and a new question.
      guessAnimal = current.getData( );
      System.out.println("I give up. What are you? ");
      correctAnimal = stdin.nextLine( );
      System.out.println("Please type a yes/no question that will distinguish a");
      System.out.println(correctAnimal + " from a " + guessAnimal + ".");
      newQuestion = stdin.nextLine( );

      // Put the new question in the current node, and add two new children.
      current.setData(newQuestion);
      System.out.println("As a " + correctAnimal + ", " + newQuestion);
      if (query("Please answer"))
      {
         current.setLeft(new BTNode<String>(correctAnimal, null, null));
         current.setRight(new BTNode<String>(guessAnimal, null, null));
      }
      else
      {
         current.setLeft(new BTNode<String>(guessAnimal, null, null));
         current.setRight(new BTNode<String>(correctAnimal, null, null));
      }         
   }

   public static boolean query(String prompt)
   {
      String answer;

      System.out.print(prompt + " [Y or N]: ");
      answer = stdin.nextLine( ).toUpperCase( );
      while (!answer.startsWith("Y") && !answer.startsWith("N"))
      {
    System.out.print("Invalid response. Please type Y or N: ");
    answer = stdin.nextLine( ).toUpperCase( );
      }

      return answer.startsWith("Y");
   }

}

不断出现的错误是“变量子(+任何数字)可能尚未启动。”我该如何解决这个问题?

哦,这是BTNode的代码:

 public class BTNode<E>
    {
       private E data;
       private BTNode<E> left, right;   
       public BTNode(E initialData, BTNode<E> initialLeft, BTNode<E> initialRight)
       {
          data = initialData;
          left = initialLeft;
          right = initialRight;
       }       

       public E getData( )   
       {
          return data;
       }



   public BTNode<E> getLeft( )
   {
      return left;                                               
   } 



   public E getLeftmostData( )
   {
      if (left == null)
         return data;
      else
         return left.getLeftmostData( );
   }


   public BTNode<E> getRight( )
   {
      return right;                                               
   } 


   public E getRightmostData( )
   {
      if (left == null)
         return data;
      else
         return left.getRightmostData( );
   }

   public void inorderPrint( )
   {
      if (left != null)
         left.inorderPrint( );
      System.out.println(data);
      if (right != null)
         right.inorderPrint( );
   }  


   public boolean isLeaf( )
   {
      return (left == null) && (right == null);                                               
   } 


   public void preorderPrint( )
   {
      System.out.println(data);
      if (left != null)
         left.preorderPrint( );
      if (right != null)
         right.preorderPrint( );
   } 

   public void postorderPrint( )
   {
      if (left != null)
         left.postorderPrint( );
      if (right != null)
         right.postorderPrint( );
      System.out.println(data);
   }   

   public void print(int depth)
   {
      int i;

      // Print the indentation and the data from the current node:
      for (i = 1; i <= depth; i++)
         System.out.print("    ");
      System.out.println(data);

      if (left != null)
         left.print(depth+1);
      else if (right != null)
      {
         for (i = 1; i <= depth+1; i++)
            System.out.print("    ");
         System.out.println("--");
      }

      if (right != null)
         right.print(depth+1);
      else if (left != null)
      {
         for (i = 1; i <= depth+1; i++)
            System.out.print("    ");
         System.out.println("--");
      }
   }

   public BTNode<E> removeLeftmost( )
   {
      if (left == null)
         return right;
      else
      {
         left = left.removeLeftmost( );
         return this;
      }
   }

   public BTNode<E> removeRightmost( )
   {
      if (right == null)
         return left;
      else
      {
         right = right.removeRightmost( );
         return this;
      }
   }

   public void setData(E newData)   
   {
      data = newData;
   }                                                               


   public void setLeft(BTNode<E> newLeft)
   {                    
      left = newLeft;
   }



   public void setRight(BTNode<E> newRight)
   {                    
      right = newRight;
   }  

   public static <E> BTNode<E> treeCopy(BTNode<E> source)
   {
      BTNode<E> leftCopy, rightCopy;

      if (source == null)
         return null;
      else
      {
         leftCopy = treeCopy(source.left);
         rightCopy = treeCopy(source.right);
         return new BTNode<E>(source.data, leftCopy, rightCopy);
      }
   }

   public static <E> long treeSize(BTNode<E> root)
   {
      if (root == null)
         return 0;
      else
         return 1 + treeSize(root.left) + treeSize(root.right);
   }   

}

1 个答案:

答案 0 :(得分:1)

声明变量时,请确保在使用变量之前对其进行初始化。也就是说,而不是写

BTNode<String> root;
BTNode<String> child;
BTNode<String> child1;
...

BTNode<String> root = null;
BTNode<String> child = null;
...

这是因为你以后继续写下声明

child = new BTNode<String>(LEFT_QUESTION, child2, child14);

child2和child14会被初始化(而在你的情况下,它们只被声明,而不是被初始化)