diff options
Diffstat (limited to 'src/main')
| -rw-r--r-- | src/main/TreeTraversal.java | 34 | 
1 files changed, 25 insertions, 9 deletions
diff --git a/src/main/TreeTraversal.java b/src/main/TreeTraversal.java index d69164e..d7ca19d 100644 --- a/src/main/TreeTraversal.java +++ b/src/main/TreeTraversal.java @@ -23,7 +23,7 @@ public class TreeTraversal {          }      } -    public static class TreeOrders { +    static class TreeOrders {          int n;          int[] key, left, right; @@ -42,7 +42,7 @@ public class TreeTraversal {          List<Integer> inOrder() {              Stack<Integer> keyIndexStack = new Stack<>(); -            ArrayList<Integer> result = new ArrayList<Integer>(); +            ArrayList<Integer> result = new ArrayList<>();              // Finish the implementation              // You may need to add a new recursive method to do that              boolean walkLeft = true; @@ -76,7 +76,7 @@ public class TreeTraversal {          List<Integer> preOrder() {              Stack<Integer> keyIndexStack = new Stack<>();              Queue<Integer> keyIndexQueue = new LinkedList<>(); -            ArrayList<Integer> result = new ArrayList<Integer>(); +            ArrayList<Integer> result = new ArrayList<>();              // Finish the implementation              // You may need to add a new recursive method to do that              boolean walkLeft = true; @@ -113,13 +113,24 @@ public class TreeTraversal {          List<Integer> postOrder() {              Stack<Integer> keyIndexStack = new Stack<>(); -            ArrayList<Integer> result = new ArrayList<Integer>(); +            HashSet<Integer> peekedSet = new HashSet<>(); +            ArrayList<Integer> result = new ArrayList<>(); +//            ArrayList<Integer> bothSidesHaveBeenChecked = new ArrayList<>();              // Finish the implementation              // You may need to add a new recursive method to do that              boolean walkLeft = true;              int currentIndex = 0;              keyIndexStack.push(currentIndex); -            while (!keyIndexStack.empty() || right[currentIndex] != -1) { +//            while (!keyIndexStack.empty() || right[currentIndex] != -1) { +            while (!keyIndexStack.empty()) { +                if (peekedSet.contains(currentIndex)) { +                    result.add(key[currentIndex]); +                    peekedSet.remove(currentIndex); +                    keyIndexStack.pop(); +                    if (keyIndexStack.empty()) break; +                    currentIndex = keyIndexStack.peek(); +                    continue; +                }                  if (walkLeft) {                      if (left[currentIndex] != -1) {                          currentIndex = left[currentIndex]; @@ -131,18 +142,23 @@ public class TreeTraversal {                              keyIndexStack.pop();                              currentIndex = keyIndexStack.peek();                          } else { +                            peekedSet.add(currentIndex);                              currentIndex = right[currentIndex];                              keyIndexStack.push(currentIndex);                          }                      }                  } else {                      if (right[currentIndex] != -1) { +                        peekedSet.add(currentIndex);                          currentIndex = right[currentIndex];                          keyIndexStack.push(currentIndex);                          walkLeft = true;                      } else {                          result.add(key[currentIndex]); -                        keyIndexStack.pop(); +                        int i = keyIndexStack.pop(); +                        if (i != currentIndex) +                            result.add(key[i]); +                        if (keyIndexStack.empty()) break;                          currentIndex = keyIndexStack.peek();                      }                  } @@ -156,20 +172,20 @@ public class TreeTraversal {              public void run() {                  try {                      new TreeTraversal().run(); -                } catch (IOException e) { +                } catch (IOException ignored) {                  }              }          }, "1", 1 << 26).start();      } -    public void print(List<Integer> x) { +    private void print(List<Integer> x) {          for (Integer a : x) {              System.out.print(a + " ");          }          System.out.println();      } -    public void run() throws IOException { +    private void run() throws IOException {          TreeOrders tree = new TreeOrders();          tree.read();          print(tree.inOrder());  | 
