C++ 从上到下横向打印BST
我有一个关于BST打印的问题。我可以使用不同的树打印算法横向打印树。但是,我总是从左到右打印树。那么有没有办法把这棵树倒过来打印呢?我看到了一些关于使用XY的想法,但我不想在控制台中这样做,所以有什么不同的方法来实现相同的事情吗 编辑:例如,我的输入为L、M、R、T、S、G、Y、S、D、E、C、A。使用顺序遍历,我得到了这个输入C++ 从上到下横向打印BST,c++,stl,binary-search-tree,C++,Stl,Binary Search Tree,我有一个关于BST打印的问题。我可以使用不同的树打印算法横向打印树。但是,我总是从左到右打印树。那么有没有办法把这棵树倒过来打印呢?我看到了一些关于使用XY的想法,但我不想在控制台中这样做,所以有什么不同的方法来实现相同的事情吗 编辑:例如,我的输入为L、M、R、T、S、G、Y、S、D、E、C、A。使用顺序遍历,我得到了这个输入 Y T S R M L G E
Y
T
S
R
M
L
G
E
D
C
A
我想要的是和向右旋转90度一样,我应该在上面,后面跟着其他人
编辑2:下面是使用级别顺序打印树的代码,但是,我不确定如何将显示的格式设置为我想要的格式
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;
}
你是说?你会怎么用手来做?这才是真正的问题;C++代码只是写下所有的步骤。我的方法是在中间打印顶部节点L,因此前面有40个空格。第二级节点,我会打印20克,然后在前面40米的空间。第三级,我会打印10个空格,然后是C,然后是20个空格,等等
也就是说,在深度D处,我有需要打印的2D元素,因此每个元素都获得线宽>>D宽度。这是我的代码。它印得很好,可能不是完全对称的。 小说明: 第一个功能-逐级打印根lv->离开lv 第二个功能-距新线起点的距离 第三个功能-打印节点并计算两次打印之间的距离;
输出:树的实现是否有到其父节点的链接?如果是这样的话,我认为应该可以这样做。如果没有,那么你可以运行一个普通的打印并将这些值存储在一个数组中,然后向后遍历它,这将是非常低效的。你说的倒过来是什么意思?是的,有左指针和右指针。倒过来是指像实际的树一样从上到下打印树。@Spincel我想知道是否有指向树的指针节点的父节点,如if I do child->parent do I使节点1级别更接近根节点。我尝试过这样做,但是,我不确定如何精确地显示队列中的数据。
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