java:debug 一棵树(输出树到控制台)

public class 树的调试 {

    private final static Tree EMPTY = new EMPTY();

    static class Tree {
        Tree left = EMPTY, right = EMPTY, parent;
        int i, o;

        Tree(int i) {
            this.i = i;
        }

        /*前序遍历*/
        int prev() {
            Stack stack = new Stack<>();
            Tree root = this;
            int offset = 0;
            while (!stack.isEmpty() || root != EMPTY) {
                if (root == EMPTY) {
                    root = stack.pop();
                    root.o = offset++;
                    root = root.right;
                } else {
                    stack.push(root);
                    root = root.left;
                }
            }
            return offset;
        }

        /*层序遍历*/
        int iter(List map, int offset) {
            Deque deque = new LinkedList<>();
            Deque nextDeque = new LinkedList<>();
            deque.push(this);
            int height = 0, padding = -1;
            while (!deque.isEmpty()) {
                Tree tree = deque.poll();
                tree.right.parent = tree;
                tree.left.parent = tree;

                int wh = (height << 1) | 1;
                int th = height << 1;
                String[] nodeArrays;
                String[] splitArrays;
                if (map.size() <= wh) {
                    nodeArrays = new String[(offset << 1) | 1];
                    splitArrays = new String[(offset << 1) | 1];
                    map.add(splitArrays);
                    map.add(nodeArrays);
                } else {
                    nodeArrays = map.get(wh);
                    splitArrays = map.get(th);
                }
                nodeArrays[tree.o << 1] = tree.i + "";
                padding = Math.max(nodeArrays[tree.o << 1].length(), padding);
//                splitArrays[tree.o] = "|";

                /*初始化父部分*/
                Tree parent = tree.parent;
                if (parent != null) {
                    wh = ((height - 1) << 1) | 1;
                    if (parent.left == tree) {
                        splitArrays[tree.o << 1 | 1] = "/";
                        String[] strings = map.get(wh);
                        for (int i = (tree.o << 1) + 2 ; i < (parent.o << 1); i++) {
                            strings[i] = "_";
                        }
                    } else {
                        String[] strings = map.get(wh);
                        splitArrays[(tree.o << 1) - 1] = "\\";
                        for (int i = (parent.o << 1 | 1); i < (tree.o << 1) - 1; i++) {
                            strings[i] = "_";
                        }
                    }
                }


                if (tree.left != EMPTY) nextDeque.addLast(tree.left);
                if (tree.right != EMPTY) nextDeque.addLast(tree.right);
                if (deque.isEmpty()) {
                    deque = nextDeque;
                    nextDeque = new LinkedList<>();
                    height++;
                }
            }
            return padding;
        }

        void debug() {
            int o = prev();
            List list = new LinkedList<>();
            int padding = iter(list, o);
            for (String[] lines : list) {
                StringBuilder builder = new StringBuilder();
                for (String line : lines) {
                    if (line == null) {
                        builder.append(" ".repeat(padding));
                    } else if (line.equals("_")) {
                        builder.append(line.repeat(padding));
                    } else if (line.equals("/")) {
                        builder.append(line).append(" ".repeat(padding - 1));
                    } else if (line.equals("\\")) {
                        builder.append(" ".repeat(padding - 1)).append(line);
                    } else {
                        builder.append(line).append(" ".repeat(padding - 1));
                    }
                }
                System.out.println(builder.toString());
            }
        }
    }

    static class EMPTY extends Tree {

        public EMPTY() {
            super(0);
        }

        @Override
        int prev() {
            return 0;
        }

        @Override
        int iter(List map, int offset) {
            return 0;
        }
    }


    static Tree create() {
        Tree root = new Tree(7);
        root.right = new Tree(2);
        root.right.left = new Tree(8);
        root.right.left.left = new Tree(11);
        root.left = new Tree(10);
        root.left.left = new Tree(4);
        root.left.right = new Tree(3);
        root.left.right.right = new Tree(1);
        return root;
    }

    public static void main(String[] args) {
        create().debug();

    }


}

debug 遍历了三次树,如果有更好的方案请留言。还需要多测试几次

你可能感兴趣的:(数据结构,java基础)