2015-03-04 2 views
0

Это мой код для двоичной программы, которую я выполняю для класса алгоритмов. Я продолжаю получать ошибку с ошибкой нулевого исключения, но я не знаю, что вызывает ее.Ошибки исключения Null

namespace Tree 
{ 
    class CallTree 
    { 
     static void Main(string[] args) 
     { 

      BNode HE = new BNode(0, "House Entrance"); 

      BNode LowerHallway = new BNode(0, "Lower Hallway"); 
      BNode UpperHallway = new BNode(0, "Upper Hallway"); 
      HE.setLeft(LowerHallway); 
      HE.setRight(UpperHallway); 

      BNode Lounge = new BNode(0, "Lounge"); 
      BNode Kitchen = new BNode(0, "Kitchen"); 
      LowerHallway.setLeft(Lounge); 
      LowerHallway.setRight(Kitchen); 

      BNode Balcony = new BNode(0, "Balcony"); 
      Kitchen.setRight(Balcony); 

      BNode Study = new BNode(0, "Study"); 
      BNode MasterBedroom = new BNode(0, "Master Bedroom"); 
      UpperHallway.setLeft(Study); 
      UpperHallway.setRight(MasterBedroom); 

      BNode GuestBath = new BNode(0, "Guest Bath"); 
      BNode GuestBedroom = new BNode(0, "Guest Bedroom"); 
      Study.setLeft(GuestBath); 
      Study.setRight(GuestBedroom); 

      BNode PrivateBath = new BNode(0, "Private Bath"); 
      BNode Closet = new BNode(0, "Closet"); 
      MasterBedroom.setLeft(PrivateBath); 
      MasterBedroom.setRight(Closet); 

      HBinaryTree HBinaryTree = new HBinaryTree(HE); 
      BNode rootNode = HBinaryTree.GetRoot(); 

Я получаю исключение для 'RootNode' здесь V

  HBinaryTree.preOrder(rootNode); 
      //HBinaryTree.inOrder(rootNode); 
      //HBinaryTree.postOrder(rootNode); 

      Console.ReadKey(); 
     } 
    } 
    //definition of node in a binary tree 
    public class BNode 
    { 
     public string room; 
     public int treasure; 

     public BNode left, right;//left child and right child 

     public BNode(int item, string room) 
     { 
      treasure = item; 
      left = null; 
      right = null; 
     } 

     public BNode(int item, string room, BNode leftNode, BNode rightNode) 
     { 
      treasure = item; 
      left = leftNode; 
      right = rightNode; 
     } 

     public void show() 
     { 
      Console.Write(treasure); 
     } 
     //Is it interial node? 
     public bool isInner() 
     { 
      return left != null || right != null; 
     } 
     //Is it a leaf node? 

     public bool isLeaf() 
     { 

      return left == null && right == null; 
     } 

     //Does it have a left child? 
     public bool hasLeft() 
     { 
      return left != null; 
     } 

     //Does it have a right child? 
     public bool hasRight() 
     { 
      return right != null; 
     } 
     //Set its left child to be newLeft 
     public void setLeft(BNode newLeft) 
     { 
      left = newLeft; 
     } 

     //Set its right child to be newRight 
     public void setRight(BNode newRight) 
     { 
      right = newRight; 
     } 

     //return data value 
     public int getValue() 
     { 
      return treasure; 
     } 

     //set data value 
     public void setValue(int newValue) 
     { 
     treasure = newValue; 
     } 

    } 

    //definition of a proper binary tree 
    class HBinaryTree 
    { 

     public BNode root; //root of the tree 

     public HBinaryTree() 
     { 
      root = null; 
     } 

     public BNode GetRoot() 
     { 
      return root; 
     } 

     public HBinaryTree(BNode rootNode) // constructor 
     { 
      root = rootNode; 
     } 
     // PreOrder traversal 
     public void preOrder(BNode root) 
     { 

И больше ошибок исключение для 'корня' в этих 4-х линий V

  root.show(); 
      if (root.isInner()) 
      { 
       preOrder(root.left); 
       preOrder(root.right); 
      } 

     } 

     //// InOrder traversal 
     //public void inOrder(BNode root) 
     //{ 

     // if (root.isInner()) 
     // { 
     //  inOrder(root.left); 
     // } 
     // root.show(); 
     // if (root.isInner()) 
     // { 
     //  inOrder(root.right); 
     // } 
     //} 

     //PostOrder traversal 
     //public void postOrder(BNode root) 
     //{ 

     // if (root.isInner()) 
     // { 
     //  postOrder(root.left); 
     //  postOrder(root.right); 
     // } 
     // root.show(); 
     //} 
    } 
} 

Я хотел бы, если бы кто-то может помочь мне вывести, что вызывает исключения для «root» и «rootNode». Он утверждает, что они являются нулевыми, но я не могу понять, почему он это утверждает.

+0

Полный пример, который иллюстрирует проблему, может помочь. В этих примерах вне контекста я не вижу ничего плохого. В противном случае вы можете попробовать отладить свой код. Найдите точку, в которой, по вашему мнению, должна быть назначена нулевая переменная, и выясните, назначена ли она и действительно ли она является переменной, которую вы разыскиваете. Наверное, это не так. – phoog

+0

@phoog Приведенный код действительно показывает проблему. – LarsTech

+0

@LarsTech Я думаю, я не смотрел на это достаточно близко. В этом проблема заключается в том, чтобы включать примеры большого кода в SO-вопросы. – phoog

ответ

3

Функция preOrder рекурсивно вызывает себя для левого и правого узлов у каждого узла вашего дерева, если isInner возвращает true. isInner возвращает true, если любой из его узлов не равен NULL, но ваша кухня имеет только правильную ветвь, а ее левая - нуль. Поэтому, когда эта функция доходит до кухни, она видит, что isInner правдиво, и она называет себя левой ветвью от кухни, которая равна нулю. Вам нужно проверить значение null для левой и правой сторон.

+0

Да, этот пример не подходит для пятого рекурсивного вызова. Это можно увидеть при отладке. –

+0

Я ничего не вижу, когда отлаживаю, только ошибки, это не дает мне остальную часть дерева. Но спасибо, я попробую это. –

+0

Хорошо, мне удалось заставить его отключить исключение, но все это отображает 000, ничего больше. –

Смежные вопросы