INPUT: (A,B) (A,C) (B,G) (C,H) (E,F) (B,D) (C,E)
OUTPUT: (A(B(D)(G))(C(E(F))(H)))
(parent(child)(child))
Error Code Type of error
E1 More than 2 children
E2 Duplicate Edges - (A,B) (A,B)
E3 Cycle present
E4 Multiple roots
E5 Any other error
就是给一个图,判断是不是合法的二叉树,是的话,输出二叉树的字符串表达式,不是的话,输出错误码。
public class GraphEdgeTree { public static class Edge { char from, to; public Edge(String exp) { String[] nodes = exp.replaceAll("[\\(\\)\\s]", "").split(","); from = nodes[0].charAt(0); to = nodes[1].charAt(0); } } private Map<Character, Character> map = new HashMap<>(); private Map<Character, Set<Character>> childMap = new HashMap<>(); private List<Edge> edges = new ArrayList<>(); public GraphEdgeTree(String exp) { String[] arr = exp.split("\\s"); for(String str:arr) { Edge edge = new Edge(str); edges.add(edge); map.put(edge.from, edge.from); map.put(edge.to, edge.to); Set<Character> children = childMap.get(edge.from); if(children == null) { children = new HashSet<Character>(); } children.add(edge.to); childMap.put(edge.from, children); } } public Character find(char x) { Character parent = map.get(x); if(parent == null || parent == x) { return parent; } return find(parent); } public void union(char x, char y) { Character xp = find(x); Character yp = find(y); map.put(xp, yp); } public boolean isEdgeExisted(Edge edge) { Character p = map.get(edge.to); return p != null && p == edge.from; } public String buildTree() { for(Character key:childMap.keySet()) { Set<Character> set = childMap.get(key); if(set != null && set.size()>2) { return "E1"; } } for(Edge edge:edges) { if(isEdgeExisted(edge)) { return "E2"; } char xp = find(edge.from); char yp = find(edge.to); if(xp == yp) { return "E3"; } union(edge.to, edge.from); } if(rootNum() > 1) { return "E4"; } return null; } private int rootNum() { int cnt = 0; for(char key:map.keySet()) { if(find(key) == key) { cnt++; } } return cnt; } public String treeString(char root) { Set<Character> children = childMap.get(root); if(children == null || children.size() == 0) { return "("+root+")"; } StringBuilder result = new StringBuilder("("+root); for(char child:children) { result.append(",").append(treeString(child)); } result.append(")"); return result.toString(); } public char getRoot() { return find(edges.get(0).from); } public static void main(String[] args) { String input = "(A,B) (A,C) (B,G) (C,H) (E,F) (B,D) (C,E)"; GraphEdgeTree gt = new GraphEdgeTree(input); String error = gt.buildTree(); if(error != null) { System.out.println(error); } else { String result = gt.treeString(gt.getRoot()); System.out.println(result); } } }