2013-01-11 136 views
1

下面的發現和是我的代碼:DFS - Java的遞歸 - 節點

class Node{ 
    int value; 
    Node left; 
    Node right; 
    Node parent; 
     //getters, setters 
} 

創建樹

private static void createTree() throws FileNotFoundException{ 
    Map<String,Node> nodeMap = new HashMap<String,Node>(); 
    Scanner sc = new Scanner(new File("<location>")); 
    int row =0; 
    while(sc.hasNextLine()){ 
     String line = sc.nextLine(); 
     Scanner scanLine = new Scanner(line); 
     System.out.println(line); 
     int col =0; 

     while(scanLine.hasNextInt()){ 
      int value = scanLine.nextInt(); 
      System.out.println(row+","+col+"="+value); 
      Node node = new Node(value); 
      nodeMap.put(row+","+col,node); 
      if(row >0){ 
       if(col %2 ==0){ 
        //left node 
        Node parent = nodeMap.get(row-1+","+col/2); 
        if(parent !=null){ 
         node.setParent(parent); 
         parent.setLeft(node); 
        } 
       }else{ 
        //right node 
        Node parent = nodeMap.get(row-1+","+(col-1)/2); 
        if(parent !=null){ 
         node.setParent(parent); 
         parent.setRight(node); 
        } 
       } 
      } 
      col++; 
     } 
     row++; 
    } 
    System.out.println(nodeMap); 
    Node root = nodeMap.get("0,0"); 
    traverseTree(root); 
    System.out.println("sum="+sum); 


} 

實際穿越

static int sum =0; 
private static void traverseTree(Node n){ 
    if(n != null){ 
     sum+=n.value; 
     traverseTree(n.left); 
     traverseTree(n.right); 
    } 
} 

我有2個問題:

  1. 讀取輸入並創建樹:我從文件中讀取它並在散列映射中存儲 根節點。有什麼選擇?

  2. 在遞歸搜索中,我將這個和保存在函數之外,所以它有可能以順序方式計算和。是否有可能在內部保留總和變量並在最後返回總值?

回答

0

我從文件中讀取,並存儲在HashMap中的根節點。有什麼選擇?

如何你正在做似乎很合理給出明顯的輸入格式,不過我建議你使用List<List<Node>>,而不是用繩子將其存儲,作爲你的性能可能會下降很快,因爲字符串是非常相似的,這可能會導致散列衝突,如果輸入很大,則會大大降低地圖的性能。

在遞歸搜索中,我將函數的和保存在函數外,所以可以按順序計算總和。是否有可能在內部保留總和變量並在最後返回總值?

private static int traverseTree(Node n) { 
    if (n != null) { 
     return n.value + traverseTree(n.left) + traverseTree(n.right); 
    } else { 
     return 0; 
    } 
}