Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C语言打印树_C_Printing_Tree - Fatal编程技术网

用C语言打印树

用C语言打印树,c,printing,tree,C,Printing,Tree,我想开发一个函数来可视化控制台中的树。例如,我想要这样的输出: 2 / \ / \ / \ / \ 7 5 / \ \ / \ \ 2 6 9 / \ / 5 8 4 我想了很多方法来做到这一点。然而,每个

我想开发一个函数来可视化控制台中的树。例如,我想要这样的输出:

       2               
      / \       
     /   \      
    /     \     
   /       \    
   7       5       
  / \       \   
 /   \       \  
 2   6       9   
    / \     /   
    5 8     4   

我想了很多方法来做到这一点。然而,每个解决方案都需要指向兄弟节点的额外指针。由于我开发了一个红黑树,这意味着我必须在其他函数(如insert()、delete()和rotations)上添加更多的代码行,以便在每次发生更改时设置同级指针。那么,有没有人已经在C中开发了这样一个函数?

实际上,这并不难,也不需要对节点结构进行任何修改。您需要遵循以下步骤:

  • 确定树的高度和节点值的最大宽度
  • 最后一行的宽度为
    width=(w+1)*pow(2,h)-1
    个字符
  • 行数为
    height=h+(width-w-2)/2
  • 为输出分配一个2D字符数组
  • 使用精心编制的递归例程,将树绘制到矩阵中。提示:您需要传递
    h
    w
    宽度
    高度
    ,节点ptr,其深度及其水平位置和垂直位置
  • 对于每个节点,在该位置合成节点值,对于左、右每个非空子节点,计算其相对位置,绘制链接并递归
  • 输出2D矩阵

虽然完全可能,但问题在于让您的功能智能化,能够识别分支的位置,以便A)有足够的空间容纳所有未来的分支,B)能够在一小部分空间内容纳2个以上的孩子。虽然这个概念听起来很简单,但实际上这是一个完整的研究规模的项目。因此,它可能过于宽泛。但是,
tree
terminal命令可以更容易地表示树,而不是像您现在希望的那样显示它。您的树肯定有一个有趣的排序范例!在等待其他人为您解决之前,先做一点。我肯定我已经做了这件事或类似的事情,因此对于“精心制作”的,请阅读“棘手”的w.r.t水平对齐。通过减去(再加上)左(再加右)节点的增量,可以计算节点值中间的水平位置。这个增量在递归时被减半。垂直增量是水平增量+1。请注意,使用此模式
\\\\\\\\\\
可以生成外观更好的输出,并且当水平增量超过2时,可以在下一行生成一个``。这是一个简单的解决方案,但实际上只适用于平衡树;否则,它会占用太多的水平空间。@rici:我不否认,OP的示例确实占用了太多的水平空间,这可以通过鼠标选择区域看到。通过扫描所有白色的初始和最终色谱柱,可以去除部分废物。