[英]Printing a Binary search Tree in a certain format diagram. in c
我需要打印一个二叉搜索树,它看起来应该像一棵树,这意味着如果我有一个5,6,7的树,打印功能将像示例1一样打印它:
insert
5
insert
6
insert
7
Tree is:
5
6
7
现在让我们说一棵树是4,3,7,结果应类似于示例2 :
insert
4
insert
3
insert
7
tree is:
4
3 7
有1个限制:应以递归方式进行。
这是我尝试使用以下方法解决此问题的代码:
void PrintTabs(int n)
{
if(n==0)
{
return;
}
else
{
printf("\t");
PrintTabs(--n);
}
}
void PrintTree(BST* root, int level)
{
if (root==NULL)
{
return;
}
PrintTree(root->Right,++level);
PrintTabs(level);
printf("%d\n",*(int*)root->Value);
PrintTree(root->Left,++level);
}
我的2个主要问题是它始终向右滑动打印,因此我在两次递归调用之间移动了打印部分,这给了我不好的结果,但是不知何故它具有我想要的树格式
//这用于从根查找最左边的节点(即,剩余的节点数)。 计算得出的结果是将根打印在中间。
findAlignment (BST * root, int *leftMost, int leftness) {
if (root == NULL) {
return;
}
if (leftness > *leftMost) {
*leftMost = leftness;
}
findAlignment (root->left, leftMost, (leftness + 1));
findAlignment (root->right, leftMost, (leftness - 1));
}
//使用最左边的节点信息打印树。 它根据级别和要直接打印的节点的左侧调整光标位置。
void PrintTree(BST* root, int leftAlignment, int level)
{
if (root==NULL)
{
return;
}
// the first printf aligns the position of cursor on the screen.
// This code may not be portable on all machines.
// see http://c-faq.com/osdep/termcap.html for details.
// This particular print moves the cursor to row: 'level' and col: 'leftAlignment * 4'.
// You can change the multiplication factor from 4 based on
// how many chars root->value will have and your other requirements to make it properly align.
// You can also multiply level by some factor, if you want to align better.
printf("\033[%d;%dH", level, leftAlignment * 4);
printf("%d",root->Value);
PrintTree(root->Left, leftAlignment - 1, level + 1);
PrintTree(root->Right, leftAlignment + 1, level + 1);
}
int leftMost = 0;
findAlignment (root, &leftMost, 0);
printf("\033[2J"); // clear screen
printTree (root, leftMost, 0);
对不起,我没有足够的代表。 将此发表为评论。 由于BST通常只以一种方式(向下)重复出现,因此我会做一些不同的事情。 如果对于每个节点,您要弄清楚它是左移还是右移,只需跟踪节点中的位置即可。 防爆。 我向左走了两次,向右走了一次,所以我与root的差是-1(向左走一次)。 每次添加节点时,您都可以复制父节点的位置,并为子节点添加1或-1。 然后,您可以轻松地在选项卡功能中使用该数字,以逐步浏览树并根据需要添加选项卡。
root(0)
left(-1) right(1)
left(-2) right(0)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.