【问题标题】:Printing a Binary search Tree in a certain format diagram. in c以特定格式图表打印二叉搜索树。在 c
【发布时间】:2023-03-18 02:55:01
【问题描述】:

我需要打印一个二叉搜索树,它应该看起来像一棵树,这意味着如果我有一个 5、6、7 的树,打印函数将像 Example 1 一样打印它:

insert
5
insert
6
insert
7
Tree is:
    5
        6
            7

现在假设一棵树是 4,3,7 结果应该是 Example 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);
}

我的两个主要问题是它总是向右滑动打印,所以我在两个递归调用之间移动了打印部分,这给了我一个糟糕的结果,但不知何故它有我寻找的树的格式

【问题讨论】:

  • 我认为作为一名学生的想法是你自己做练习。你至少应该先尝试解决问题。
  • 我尝试了几次,但我无法回溯原始根,我的意思是我在根之前打印叶子加上我无法正确形成它,相信我我尝试了几个小时,我最后的选择是在这里问这个问题。
  • 好的 - 很好,你正在尝试它并且你已经缩小了你遇到的实际问题。这可以帮助人们快速解决您的问题。我建议您编辑问题并发布您的递归代码,也许人们可以看到您哪里出错了。但是,在我的脑海中,一旦您返回调用堆栈的后面,原始根将可用。
  • 发布您的代码以进一步了解它
  • 感谢您的快速回复,我是 StackOverFlow 的新手。很快我将发布我尝试编写的功能。

标签: c binary-tree binary-search-tree


【解决方案1】:

// 这用于从根中找到最左边的节点(即,还剩多少)。这是计算出来的,所以根被打印在中心。

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);

【讨论】:

  • 我没有注意重叠的情况(重叠是因为对齐没有正确调整)。这可能需要在 findAlignment 函数中进行更多工作,或者需要添加更多逻辑。但是,上面的代码应该适用于大多数简单的二叉搜索树。
【解决方案2】:

对不起,我没有足够的代表。将此作为评论发布。由于 BST 通常意味着仅以一种方式(向下)重复,因此我会对此有所不同。如果对于每个节点,您可以确定它是向左还是向右,并只跟踪节点中的那个位置。前任。我向左两次,向右一次,所以我与根的区别是-1(向左一次)。每次添加节点时,您可以复制父节点的位置,只需为子节点添加 1 或 -1。然后,您可以轻松地使用该数字与您的选项卡功能来逐步浏览树并根据需要添加选项卡。

                          root(0)
                     left(-1)       right(1)
                 left(-2)  right(0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多