UniQuet0p1

Untitled

Jan 13th, 2022
1,332
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.75 KB | None | 0 0
  1. import java.util.*;
  2. public class Answer {
  3.  private String name;
  4.  private Answer firstChild;
  5.  private Answer nextSibling;
  6.  Answer (String n, Answer d, Answer r) {
  7.  setName (n);
  8.  setFirstChild (d);
  9.  setNextSibling (r);
  10.  }
  11.  public void setName (String n) { name = n; }
  12.  public String getName() { return name; }
  13.  public void setFirstChild (Answer d) { firstChild = d; }
  14.  public Answer getFirstChild() { return firstChild; }
  15.  public void setNextSibling (Answer r) { nextSibling = r; }
  16.  public Answer getNextSibling() { return nextSibling; }
  17.  @Override
  18.  public String toString() {
  19.  return leftParentheticRepresentation();
  20.  }
  21.  public String leftParentheticRepresentation() {
  22.  StringBuffer b = new StringBuffer();
  23.  b.append (getName());
  24.  if (getFirstChild() != null) {
  25.  b.append ("(");
  26.  b.append (getFirstChild().leftParentheticRepresentation());
  27.  Answer right = getFirstChild().getNextSibling();
  28.  while (right != null) {
  29.  b.append ("," + right.leftParentheticRepresentation());
  30.  right = right.getNextSibling();
  31.  }
  32.  b.append (")");
  33.  }
  34.  return b.toString();
  35.  }
  36.  public static Answer parseTree (String s) {
  37.  if (s == null) return null;
  38.  if (s.length() == 0) return null;
  39.  Answer root = null;
  40.  Answer curr = null;
  41.  Answer last = null;
  42.  int state = 0; // begin
  43.  Stack<Answer> stk = new Stack<Answer>();
  44.  StringTokenizer tok = new StringTokenizer (s, "(),", true);
  45.  while (tok.hasMoreTokens()) {
  46.  String w = tok.nextToken().trim();
  47.  if (w.equals ("(")) {
  48.  state = 1; // from up
  49.  } else if (w.equals (",")) {
  50.  state = 2; // from left
  51.  } else if (w.equals (")")) {
  52.  state = 3; // from down
  53.  stk.pop();
  54.  } else {
  55.  curr = new Answer (w, null, null);
  56.  switch (state) {
  57.  case 0: {
  58.  root = curr;
  59.  break;
  60.  }
  61.  case 1: {
  62.  last = stk.peek();
  63.  last.setFirstChild (curr);
  64.  break;
  65.  }
  66.  case 2: {
  67.  last = stk.pop();
  68.  last.setNextSibling (curr);
  69.  break;
  70.  }
  71.  default: {
  72.  // do not pop here but after ")"
  73.  }
  74.  } // switch
  75.  stk.push (curr);
  76.  }
  77.  } // next w
  78.  return root;
  79.  }
  80.  private List<Integer> c = new LinkedList();
  81.  
  82.  private void calc(Answer a) {
  83.  int result = 1;
  84.  if (a.firstChild == null) return;
  85.  
  86.  Answer answer = a.firstChild;
  87.  while (answer.nextSibling != null){
  88.  
  89.  answer = answer.nextSibling;
  90.  if (answer != null) calc(answer);
  91.  result++;
  92.  }
  93.  c.add(result);
  94.  }
  95.  
  96. public int maxWidth() {
  97.  
  98. if (this.firstChild == null) return 0;
  99. calc(this);
  100.  return Collections.max(c);
  101. }
  102.  public static void main (String[] param) {
  103.  Answer v = Answer.parseTree ("A(B,C(D,F(K,L,M,N(O)),P))");
  104.  System.out.println (v);
  105.  int n = v.maxWidth();
  106.  System.out.println ("Maximum number of children: " + n); // 4
  107.  
  108.  v = Answer.parseTree("A(B(C))");
  109.  System.out.println (v);
  110.  n = v.maxWidth();
  111.  System.out.println ("Maximum number of children: " + n); // 1
  112.  }
  113. }
Advertisement
Add Comment
Please, Sign In to add comment