2012-08-13 219 views
0

以下設計是否可以進一步優化?我使用了一個hashmap和一個Q​​ueue。 SO空間複雜度將是O(n)和運行時會爲O(n)打印所有路徑的二叉樹

public class PrintAllRootToLeaves { 

    public static void print(BinaryTreeNode root) {  

     Queue nodesQ = new Queue(); 
     HashMap hMap = new HashMap(); 
     BinaryTreeNode head = root; 
     String tempVal ;   
     hMap.put(head,String.valueOf(head.getData())); 
     while (head != null) { 

      BinaryTreeNode left = head.getLeft(); 
      BinaryTreeNode right = head.getRight(); 

      if (left != null) { 
       if ((tempVal = (String) hMap.get(head)) != null) {     
        hMap.put(left,tempVal + left.getData()); 
       } 
       nodesQ.enqueue(left); 
      } 

      if (right != null) { 
       if ((tempVal = (String) hMap.get(head)) != null) { 
        hMap.put(right,tempVal + right.getData()); 

       } 
       nodesQ.enqueue(right); 
      }   
      if (right != null && left != null) { 
       hMap.remove(head); 
      } 
      head = (BinaryTreeNode) nodesQ.dequeue();      
     }  
     System.out.println("-----------Printing all routes ---------->" + hMap.values());    
    } 
} 
+4

看樣子你需要遍歷每個節點,所以我看不到複雜性如何爲O少( N)。你可以做的是使用StringBuilder,而不是附加到一個字符串。 – 2012-08-13 14:26:16

+0

你爲什麼要從循環中的散列表中刪除節點,你是否只打印最低的樹節點? – 2012-08-13 14:28:17

+3

這不能在'O(N * Log N)'下完成,因爲你有'N * Log N'項目需要打印。 – dasblinkenlight 2012-08-13 14:37:32

回答

-1
public class BinaryTree { 


    private class Node { 
     final int key; 
     final int value; 
     Node left; 
     Node Right; 

     public Node (Node node, int pKey, int qValue) { 
      key = pKey; 
      value = qValue; 
      if (node != null && node.key < pKey) { 
       left = node; 
      } 
      else if (node != null) { 
       Right = node; 
      } 
     } 
    } 


    public void preOrderTraversal(Node pNode,String path){ 

     if (path == null) { 
      path = ""; 
     } 
     if (pNode != null) { 
      path = path+" "+String.valueOf(pNode.key); 
//If you remove the modulo check it will print all the paths. 
      if (pNode.key%5 == 0) { 
       System.out.println(path); 
      } 
      preOrderTraversal(pNode.left,path); 

      preOrderTraversal(pNode.Right,path); 

     } 

    } 


    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     Node node1 = new BinaryTree().new Node(null, 5, 2); 
     Node node2 = new BinaryTree().new Node(null, 10, 25); 
     Node node3 = new BinaryTree().new Node(node1, 7, 50); 
     node3.Right = node2; 
     Node root = new BinaryTree().new Node(node3, 15, 6); 
     Node node4 = new BinaryTree().new Node(null, 30, 8); 
     Node node5 = new BinaryTree().new Node(node4, 20, 7); 
     root.Right = node5; 
//This will print paths only divisable by 5 
     new BinaryTree().preOrderTraversal(root,null); 
    } 

} 
+0

這是如何回答這個問題的? – 2013-08-01 03:06:04