1. 程式人生 > >列印二叉樹所有的路徑

列印二叉樹所有的路徑

問題:

給一個二叉樹,把所有的路徑都打印出來。

比如,對於下面這個二叉樹,它所有的路徑為:

8 -> 3 -> 1

8 -> 2 -> 6 -> 4

8 -> 3 -> 6 -> 7

8 -> 10 -> 14 -> 13

思路:

從根節點開始,把自己的值放在一個數組裡,然後把這個陣列傳給它的子節點,子節點同樣把自己的值放在這個數組裡,又傳給自己的子節點,直到這個節點是葉節點,然後把這個陣列打印出來。所以,我們這裡要用到遞迴。

程式碼:

  1. /** 
  2. Given a binary tree, prints out all of its root-to-leaf
     
  3. paths, one per line. Uses a recursive helper to do the work. 
  4. */
  5. publicvoid printPaths(Node root, int n) {  
  6.     String[] path = new String[n];  
  7.     printPaths(root, path, 0);  
  8. }  
  9. /** 
  10. Recursive printPaths helper -- given a node, and an array containing 
  11. the path from the root node up to but not including this node,
     
  12. prints out all the root-leaf paths. 
  13. */
  14. privatevoid printPaths(Node node, String[] path, int pathLen) {  
  15.     if (node == nullreturn;  
  16.     // append this node to the path array
  17.         path[pathLen++] = node.value;  
  18.     // it's a leaf, so print the path that led to here
  19.     if (node.leftChild == null
     && node.rightChild == null) {  
  20.         printArray(path, pathLen);  
  21.     }  
  22.     else {  
  23.         // otherwise try both subtrees
  24.         printPaths(node.leftChild, path, pathLen);  
  25.         printPaths(node.rightChild, path, pathLen);  
  26.     }  
  27. }  
  28. /** 
  29. Utility that prints strings from an array on one line. 
  30. */
  31. privatevoid printArray(String[] ints, int len) {  
  32.     for (int i = 0; i < len; i++) {  
  33.         System.out.print(ints[i] + " ");  
  34.     }  
  35.     System.out.println();  
  36. }  

備註:這裡只能用一個數組+一個數值才能打印出所需要的路徑,如果用linkedlist之類的連結串列結構是不行的。值得分析一下原因,很有意思。