我正在决定如何存储数据以及如何绘制树形图。假设我想要两个元素之间的最小空间M,我想我可以在呼吸优先搜索中从顶部到底部遍历整个树结构。
如果当前一个元素下面只有一个元素,它将使用与他父亲相同的X坐标绘制。如果有两个元素,它们将在-M / 2处绘制一个,而另一个在其父X坐标处以+ M / 2绘制。等等..
问题是:如果像C这样的元素(见下图)有很多孩子怎么办?我应该重组整个树,因为我应该将元素D移动到左边并为C的所有E-F孩子腾出空间。向左移动D会使树弯曲,我也需要移动B.向左移动B会改变树的对称性,所以我也需要移动C等等。
如何绘制一个完全对称的树,其元素可能包含大量子元素?
答案 0 :(得分:1)
反过来说:计算每个节点在计算后的子节点的水平位置。这样的事情(警告:完全未经测试的代码;可能完全由bug组成):
void Node::place_self(coord_t x0, coord_t y0) {
this->y0 = y0; this->y1 = y0+height;
if (!left && !right) {
// This is a leaf. Put its top left corner at (x0,y0).
this->x0 = x0; this->y0 = y0;
this->subtree_x1 = x0+width;
}
else if (!left || !right) {
// Only one child. Put this immediately above it.
Node * child = left ? left : right;
child->place_self(x0,y0+height+gap);
coord_t xc = child->x0 + child->width/2;
this->x0 = xc-width/2;
this->subtree_x1 = max(this->x0+width, child->subtree_x1);
}
else {
// Two children. Put this above their midline.
left->place_self(x0, y0+height+gap);
right->place_self(left->subtree_x1+gap, y0+height+gap);
coord_t xc = (x0 + right->subtree_x1)/2;
this->x0 = xc-width/2;
this->subtree_x1 = max(this->x0+width, right->subtree_x1);
}
}