树如下:
{‘no surfacing’: {0: ‘no’, 1: {‘flippers’: {0: {‘head’: {0: ‘no’, 1: ‘yes’}}, 1: ‘no’}}}}
目标如下
关于绘制过程中的配置参数就不说了,主要是这个绘制思路。
首先是源代码的一些简单分析
- 注意这个地方
看到是一个指回箭头,让我一开始还以为整个树是从下往上画的,其实是,每次作画时,是先画当前节点,再画上一层指向该节点的箭头(这么描述也许不对,实际上是干了一件事,就是画了一个箭头,起点是带文本的且带箭头,终点是不带文本和箭头的。)
- 其实对于最顶层的“no surfacing”也是写了文本和箭头的,文本是空字符,而箭头的坐标和终点坐标相同。主要是为了递归设计的。
- 坐标计算! 这里就是最麻烦的了。
首先需要计算整个树的特征(叶节点总数和深度),深度(D)用来规划y轴坐标,叶节点数(N)用来计算x坐标。
老外在做这种计算的时候思路真的是跟我们不一样的, 我已经不知道吃过多次吃亏了。其实思路是这样的。
0 → a 1 → a 2 → a 3 → a 4 → . . . → a n 0→a_1→a_2→a_3→a_4→...→a_n 0→a1→a2→a3→a4→...→an
在坐标轴上按照均匀分布的放置结点,那么在放下 a N a_N