生成树字符串

来源:互联网 发布:常用排序算法 编辑:程序博客网 时间:2024/05/19 11:47

输入:

5a v b  d e

输出:
a(v,b(d),e)

import java.util.ArrayList;import java.util.Scanner;public class Main {    private static class Node {        public String value;        public int level;    }    private static Node[] nodes;    public static String dfs(int left, int right, int currLevel, String currValue) {        int nextLevel = Integer.MAX_VALUE;        for (int i = left; i <= right; i++) {            if (currLevel < nodes[i].level                    && nextLevel > nodes[i].level) {                nextLevel = nodes[i].level;            }        }        if (nextLevel == Integer.MAX_VALUE || left > right) {            return currValue;        }        ArrayList<Integer> positions = new ArrayList<>();        for (int i = left; i <= right; i++) {            if (nextLevel == nodes[i].level) {                positions.add(i);            }        }        StringBuilder sb = new StringBuilder();        if (currLevel != -1) {            sb.append(currValue).append("(");        }        for (int i = 0, len = positions.size(); i < len; i++) {            int start = positions.get(i), end = right;            if (i < len - 1) {                end = positions.get(i + 1) - 1;            }            String nextNodes = dfs(start + 1, end, nodes[start].level, nodes[start].value);            if (i == 0) {                sb.append(nextNodes);            } else {                sb.append(",").append(nextNodes);            }        }        if (currLevel != -1) {            sb.append(")");        }        return sb.toString();    }    public static Node parserStr2Node(String s) {        int cnt = 0;        for (int i = 0, len = s.length(); i < len; i++) {            if (s.charAt(i) == ' ') {                cnt++;            } else {                break;            }        }        Node node = new Node();        node.value = s.trim();        node.level = cnt;        return node;    }    public static void main(String[] args) {        Scanner cin = new Scanner(System.in);        while (cin.hasNext()) {            int n = Integer.valueOf(cin.nextLine());            nodes = new Node[n];            for (int i = 0; i < n; i++) {                nodes[i] = parserStr2Node(cin.nextLine());            }            System.out.println(dfs(0, n - 1, -1, "##"));        }    }}
0 0
原创粉丝点击