package bugs; class Node { public int value; public Node left, right; public Node(int x) { value = x; left = null; right = null; } } public class JCuteBinTreeBare { static JCuteBinTreeBare act = new JCuteBinTreeBare(); private Node root; public JCuteBinTreeBare() { root = null; } public void add(int x) { Node current = root; if (root == null) { root = new Node(x); return; } while (current.value != x) { if (x < current.value) { if (current.left == null) { current.left = new Node(x); } else { current = current.left; } } else { if (current.right == null) { current.right = new Node(x); } else { current = current.right; } } } } private boolean find(int x) { Node current = root; while (current != null) { if (current.value == x) { return true; } if (x < current.value) { current = current.left; } else { current = current.right; } } return false; } public boolean remove(int x) { Node current = root; Node parent = null; boolean branch = true; //true =left, false =right while (current != null) { if (current.value == x) { Node bigson = current; while (bigson.left != null || bigson.right != null) { parent = bigson; if (bigson.right != null) { bigson = bigson.right; branch = false; } else { bigson = bigson.left; branch = true; } } // System.out.println("Remove: current "+current.value+" parent "+parent.value+" bigson "+bigson.value); if (parent != null) { if (branch) { parent.left = null; } else { parent.right = null; } } if (bigson != current) { current.value = bigson.value; } else { } return true; } parent = current; // if (current.value <x ) { // THERE WAS ERROR if (current.value > x) { current = current.left; branch = true; } else { current = current.right; branch = false; } } return false; } static void step() { int i = cute.Cute.input.Integer(); int x = cute.Cute.input.Integer(); switch (i) { case 0: act.add(x); break; case 1: act.remove(x); break; } } static void unbounded() { for (int i = 0 ; i < 10 ; i++) { step(); } } public static void main(String[] Argv) { unbounded(); } } //@The following comments are auto-generated to save options for testing the current file //@jcute.optionPrintOutput=true //@jcute.optionLogPath=false //@jcute.optionLogTraceAndInput=false //@jcute.optionGenerateJUnit=false //@jcute.optionExtraOptions= //@jcute.optionJUnitOutputFolderName=d:\sync\work\cute\java //@jcute.optionJUnitPkgName= //@jcute.optionNumberOfPaths=100 //@jcute.optionLogLevel=2 //@jcute.optionDepthForDFS=0 //@jcute.optionSearchStrategy=1 //@jcute.optionSequential=true //@jcute.optionQuickSearchThreshold=100 //@jcute.optionLogRace=true //@jcute.optionLogDeadlock=true //@jcute.optionLogException=true //@jcute.optionLogAssertion=true //@jcute.optionUseRandomInputs=false