2016-11-28 5 views
0

私は、前記要素とともに優先度の最も低い要素を返すことになっています。私はノードを使用する必要があり、配列はオプションです。これは私がこれまでに得たものですが、20行目にnullポインタエラーがあり、それを修正する方法がわかりません。助けてください最小優先度キューで最も古い要素を見つけるjava

public class MinHeap { 
    public static int timeStamp = 0; 
    public static int ts = 0; 
    public static int maxTime = 0; 
    public static Node root; 
    public MinHeap(){ 
     this.root = null; 
    } 

    public static void insert(int id, int ts){ 
     timeStamp++; 
     Node newNode = new Node(id); 
     if(root==null){ 
      root = newNode; 
     } 
     Node current = root; 
     Node parent = null; 
     while(true){ 
      parent = current; 
      if(id < current.data){ 
       current = current.left; 
       if(current==null){ 
        parent.left = newNode; 
       } 
      }else{ 
       current = current.right; 
       if(current==null){ 
        parent.right = newNode; 
       } 
      } 
     } 

    } 

    public static Node delete(int x, Node n){ 
     timeStamp++; 
     if(n==null) 
      return n; 
     if(x == n.data){ 
      if(n.left == null && n.right == null){ 
       return null; 
      }else if(n.left == null){ 
       n.right = delete(x, n.right); 
       return n; 
      }else if(n.right == null){ 
       n.left = delete(x, n.left); 
       return n; 
      }else{ 
       Node tempNode = findMin(n.right); 
       n.right = delete(tempNode.data, n.right); 
       n.data = tempNode.data; 
       return n; 
      } 
     } 
     if(x < n.data){ 
      n.left = delete(x, n.left); 
      return n; 
     }else{ 
      n.right = delete(x, n.right); 
      return n; 
     } 

    } 

    public static void display(Node root){ 
     if(root!=null){ 
      display(root.left); 
      System.out.print(" " + root.data); 
      display(root.right); 
     } 
    } 

    public static Node findMin(Node n){ 
     if(n == null){ 
     return null; 
     } 
     if(n.left == null){ 
      return n; 
     } 
     return findMin(n.left);  
    } 

    public static int maxAge(){ 
     int currentAge = 0; 
     currentAge = timeStamp - ts; 
     if(currentAge > maxTime) 
      maxTime = currentAge; 
     return maxTime; 
    } 

    public static void main(String [] arg){ 

     MinHeap min = new MinHeap(); 
     min.insert(1, ts = 0); 
     min.insert(2, ts = 1); 
     min.insert(3, ts = 2); 
     min.insert(4, ts = 4); 
     min.delete(1, root); 
     min.delete(2, root); 
     min.delete(3, root); 
     min.delete(4, root); 
     min.maxAge(); 
    } 
} 

class Node{ 
    int data; 
    Node left; 
    Node right; 
    public Node(int data){ 
     this.data = data; 
     left = null; 
     right = null; 
    } 
} 
+0

これは最小ヒープではありません。バイナリ検索ツリーです。 – EJP

+0

私は彼らが同じもののために行動したと思ったが、ただ一つ注文していた、私はバイナリ検索ツリーの以前のプログラムをminヒープにしようとしていた – tozog

答えて

0

あなたの挿入が壊れています。挿入ポイントを見つけた後に中断するのを忘れましたが、キーが既にツリーにある場合はチェックしていません。

while (true) { 
    parent = current; 
    if (id < current.data) { 
     current = current.left; 
     if (current == null) { 
      parent.left = newNode; 
      // Break after insert 
      break; 
     } 
    } else if (id > current.data) { 
     current = current.right; 
     if (current == null) { 
      parent.right = newNode; 
      // Break after insert 
      break; 
     } 
    } else { 
     // Key exists. 
     break; 
    } 
} 
関連する問題