code: import java.awt.*;
  import javax.swing.*;
  
  public class SternBrocot extends JPanel {
  
      public SternBrocot() {
          setPreferredSize(new Dimension(800, 500));
          setFont(new Font("Arial", Font.PLAIN, 18));
          setBackground(Color.white);
      }
  
      private void drawTree(int n1, int d1, int n2, int d2,
              int x, int y, int gap, int lvl, Graphics2D g) {
  
          if (lvl == 0)
              return;
  
          // mediant
          int numer = n1 + n2;
          int denom = d1 + d2;
  
          if (lvl > 1) {
              g.drawLine(x + 5, y + 4, x - gap + 5, y + 124);
              g.drawLine(x + 5, y + 4, x + gap + 5, y + 124);
          }
  
          g.setColor(getBackground());
          g.fillRect(x - 10, y - 15, 35, 40);
  
          g.setColor(getForeground());
          g.drawString(String.valueOf(numer), x, y);
          g.drawString("_", x, y + 2);
          g.drawString(String.valueOf(denom), x, y + 22);
  
          drawTree(n1, d1, numer, denom, x - gap, y + 120, gap / 2, lvl - 1, g);
          drawTree(numer, denom, n2, d2, x + gap, y + 120, gap / 2, lvl - 1, g);
      }
  
      @Override
      public void paintComponent(Graphics gg) {
          super.paintComponent(gg);
          Graphics2D g = (Graphics2D) gg;
          g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                  RenderingHints.VALUE_ANTIALIAS_ON);
  
          int w = getWidth();
  
          drawTree(0, 1, 1, 0, w / 2, 50, w / 4, 4, g);
      }
  
      public static void main(String[] args) {
          SwingUtilities.invokeLater(() -> {
              JFrame f = new JFrame();
              f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              f.setTitle("Stern-Brocot Tree");
              f.setResizable(false);
              f.add(new SternBrocot(), BorderLayout.CENTER);
              f.pack();
              f.setLocationRelativeTo(null);
              f.setVisible(true);
          });
      }
  }
  