import java.util.*; class BinaryTree extends Tree { public BinaryTree() { super();} public Iterator children(Node v) { return v.children(); } public void addRoot(Object x) { if (root != null) throw new RuntimeException(); root = new BNode(x, null, null, null); size++; } public void addLeft(BNode n, Object x) { if (n.getLeft() != null) throw new RuntimeException(); n.setLeft(new BNode(x, n, null, null)); size++; } public void addRight(BNode n, Object x) { if (n.getRight() != null) throw new RuntimeException(); n.setRight(new BNode(x, n, null, null)); size++; } public Vector inOrder() { Vector answer = new Vector(); inOrder((BNode) root(), answer); return answer; } public void inOrder(BNode n, Vector v) { if (n == null) return; inOrder(n.getLeft(), v); v.add(n); inOrder(n.getRight(), v); } public Vector flatOrder() { return inOrder(); } public BNode leftmostRightDescendant(BNode n){ if (n == null) return null; BNode m = n.getRight(); if (m == null) return null; while (m.getLeft() != null) m = m.getLeft(); return m; } public BNode rightmostLeftDescendant(BNode n){ if (n == null) return null; BNode m = n.getLeft(); if (m == null) return null; while (m.getRight() != null) m = m.getRight(); return m; } public BNode removeNode(BNode n) { if (n.getLeft() != null) { BNode m = rightmostLeftDescendant(n); n.setData(m.getData()); return removeNode(m); } if (n.getRight() != null) { BNode m = leftmostRightDescendant(n); n.setData(m.getData()); return removeNode(m); } BNode p = (BNode) parent(n); if (p == null) { root = null; } else if (p.getLeft() == n) p.setLeft(null); else p.setRight(null); size --; return p; } } class BNode extends Node { BNode left, right; public BNode(Object d, BNode p, BNode l, BNode r) { super(d, p); left = l; right = r; } public void setLeft(BNode n) { left = n; } public void setRight(BNode n) { right = n; } public BNode getLeft() { return left; } public BNode getRight() { return right; } public Iterator children() { Vector v = new Vector(); if (left != null) v.add(left); if (right != null) v.add(right); return v.iterator(); } }