以特定格式图表打印二进制搜索树。在c中
我需要打印一个二叉搜索树,它应该看起来像一棵树,这意味着如果我有一棵树,它是5,6,7,打印功能将打印它如下: 现在让我们假设一棵树是4,3,7,结果应该是这样的 : 有一个限制:它应该递归地完成 这是我试图解决此问题的代码:以特定格式图表打印二进制搜索树。在c中,c,binary-tree,binary-search-tree,C,Binary Tree,Binary Search Tree,我需要打印一个二叉搜索树,它应该看起来像一棵树,这意味着如果我有一棵树,它是5,6,7,打印功能将打印它如下: 现在让我们假设一棵树是4,3,7,结果应该是这样的 : 有一个限制:它应该递归地完成 这是我试图解决此问题的代码: void PrintTabs(int n) { if(n==0) { return; } else { printf("\t"); PrintTabs(--n); } } void PrintTree(BST*
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);
}
我的两个主要问题是它总是向右滑动打印,所以我在两个递归调用之间移动了打印部分。这给了我一个糟糕的结果,但不知怎么的,它有我查找的树的格式。Sry,我没有足够的代表将此作为评论发布。由于BST通常只能以一种方式(向下)递归,所以我会稍微改变一下。如果对于每个节点,您计算出它是向左还是向右移动,然后跟踪节点中的该位置会怎么样。我向左走了两次,向右走了一次,所以我和根的区别是-1(向左走一次)。每次添加节点时,都可以复制父节点的位置,只需为子节点添加1或-1即可。然后,您可以轻松地将该数字与tabs功能结合使用,逐步浏览树并根据需要添加选项卡
root(0)
left(-1) right(1)
left(-2) right(0)
//这用于从根中查找最左边的节点(即,还剩多少)。这是计算的,以便在中心打印根
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);
我认为作为一名学生的想法是你自己做这个练习。你至少应该先尝试解决这个问题。我自己试过几次,但我无法回溯原始根,我的意思是我在根之前打印叶子,而且我无法正确地形成它,相信我,我试了好几个小时,我的最后一个选择是在这里问这个问题。好的-很好,你正在尝试,并且你已经缩小了你面临的实际问题。这有助于人们快速解决您的问题。我建议你编辑这个问题,然后发布你的代码中递归的部分,也许人们可以看到你的错误所在。但是,在我看来,一旦你返回到调用堆栈的后面,原始根目录就可以使用了。发布你的代码以进一步了解它谢谢你的快速响应,我是StackOverFlow的新手。很快我将发布我试图编写的函数。我没有注意重叠的情况(重叠是因为对齐没有正确调整)。这可能需要findAlignment函数中的更多工作,或者需要添加更多逻辑。但是,上面的代码应该适用于大多数简单的二进制搜索树。
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);