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<Tree> 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<String[]> map, int offset) {
Deque<Tree> deque = new LinkedList<>();
Deque<Tree> 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<String[]> 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<String[]> 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 遍历了三次树,如果有更好的方案请留言。还需要多测试几次