我有一个与BST打印相关的问题。我可以使用不同的树打印算法横向打印树。但是,我总是从左到右打印树。那么有什么方法可以颠倒打印树吗?我看到了使用XY的一些想法,但我不想在控制台中这样做,所以有没有不同的方法来实现同样的事情?
编辑:例如,我输入L,M,R,T,S,G,Y,S,D,E,C,A。使用inorder遍历,我得到了这个输入
Y
T
S
R
M
L
G
E
D
C
A
我想要的是将此旋转90度向右旋转,L应该在顶部,然后是其他。
编辑2:这是使用Level Order打印树的代码,但是,我不知道如何将格式显示为我想要的。
queue<TreeNode*> q;
while(node != NULL)
{
cout << node->data << " " << endl;
if (node->left)
q.push(node->left);
if(node->right)
q.push(node->right);
if(!q.empty())
{
node = q.front();
q.pop();
}
else
node = NULL;
}
答案 0 :(得分:0)
您的意思是Breadth-First Search吗?
答案 1 :(得分:0)
你会怎样亲手做到这一点?这才是真正的问题; C ++代码只是写下所有步骤。我的方法是在中心打印顶部节点L
,因此前面有40个空格。第二级节点,我打印前面有20(G
)然后40(M
)个空格。第三级,我打印10个空格,然后是C
,然后是20个空格等......
即。在深度D,我需要打印2个 D 元素,因此每个元素的宽度都为linewidth>>D
。
答案 2 :(得分:0)
这是我的代码。它打印得非常好,也许它不完全对称。 小描述:
void Tree::TREEPRINT()
{
int i = 0;
while (i <= treeHeight(getroot())){
printlv(i);
i++;
cout << endl;
}
}
void Tree::printlv(int n){
Node* temp = getroot();
int val = pow(2, treeHeight(root) -n+2);
cout << setw(val) << "";
prinlv(temp, n, val);
}
void Tree::dispLV(Node*p, int lv, int d)
{
int disp = 2 * d;
if (lv == 0){
if (p == NULL){
cout << " x ";
cout << setw(disp -3) << "";
return;
}
else{
int result = ((p->key <= 1) ? 1 : log10(p->key) + 1);
cout << " " << p->key << " ";
cout << setw(disp - result-2) << "";
}
}
else
{
if (p == NULL&& lv >= 1){
dispLV(NULL, lv - 1, d);
dispLV(NULL, lv - 1, d);
}
else{
dispLV(p->left, lv - 1, d);
dispLV(p->right, lv - 1, d);
}
}
}
输入:
50-28-19-30-29-17-42-200-160-170-180-240-44-26-27