8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

以实际树格式查看二叉树/二叉搜索树的函数?

hosseio 1月前

29 0

有没有办法以这种方式查看 BT/BST:5 / \ 2 7 / \ / \ 1 3 6 8我浏览了互联网并找到了一种方法

有没有办法以这样的方式查看 BT/BST:

               5
             /   \
            2     7
           / \   / \
          1   3 6   8

我浏览了互联网并找到了一种显示树的方法,但它向左倾斜,如下所示:

                 8
            7
                 6
       5
                 3
            2
                 1

我想要一个可以以第一种方式打印 BT/BST 的函数。

编辑: 对于高度为 4 的树

           05
        /       \
      03         06          
    /   \       /   \       
  03    04    09    12    
  / \   / \   / \   / \      
 01 02 06 05 07 08 10 11 
帖子版权声明 1、本帖标题:以实际树格式查看二叉树/二叉搜索树的函数?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由hosseio在本站《parsing》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我在下面提供了一个将生成如下输出的程序:

              100
       
      12              230
             
    8    32        205    323
              
     10    43   201   213   999
                    
         39             225
        
       38
      
     37
    

    您可以立即运行它。它以数字作为输入,并将它们添加到 BST,然后打印结果,然后要求下一个输入:

    class Node:
        def __init__(self, value):
            self.value = value
            self.left = self.right = None
    
    class BST:
        PADDING = 3 # Space between horizontally adjacent node labels
        def __init__(self, *values):
            self.root = None
            for value in values:
                self.insert(value)
    
        def insert(self, value):
            def insert(root, value):
                if not root:
                    return Node(value)
                if value < root.value:
                    root.left = insert(root.left, value)
                else:
                    root.right = insert(root.right, value)
                return root
    
            self.root = insert(self.root, value)
    
        def __repr__(self):
            def indent(lines, margin):
                if margin >= 0:
                    return margin
                spaces = " " * -margin
                lines[:] = [spaces + line for line in lines]
                return 0
    
            def merge(left, right):
                if not left or not right:
                    return left or right
                offsetright = max(len(leftline) + BST.PADDING - (len(rightline) - len(rightline.lstrip())) 
                    for leftline, rightline in zip(left, right)
                )
                indent(right, -indent(left, offsetright))
                return [
                    leftline + rightline[len(leftline):]
                    for leftline, rightline in zip(left, right)
                ] + left[len(right):] + right[len(left):]
    
            def buildlines(node):
                if not node:
                    return []
                lines = merge(buildlines(node.left), buildlines(node.right))
                label = str(node.value)
                half = len(label) >> 1
                if not lines:
                    return [" "*half + "*", label]
                i = lines[0].index("*")
                if not node.right:
                    lines[0] = " "*i + ""
                    i += 2
                elif not node.left:
                    i = indent(lines, i - 2)
                    lines[0] = " "*i + ""
                else:
                    dist = len(lines[0]) - 1 - i
                    lines[0] = f"{' '*i}{''*((dist >> 1) - 1)}{''*((dist - 1) >> 1)}"
                    i += dist >> 1
                j = indent(lines, i - half)
                return [" "*(i + max(0, half - i)) + "*", " "*j + label] + lines
                
            return "\n".join(buildlines(self.root)[1:])
    
    
    tree = BST()
    while True:
        val = int(input("insert value: "))
        tree.insert(val)
        print(tree)
    
  • @DeepakTripathi 可能不得不尝试一下,但如果已经完成,那么如果您能在这里链接来源,我将非常感激。

  • 嗯,你考虑过 4 级树会是什么样子吗?因为随着深度的增加,上层节点之间会有很大间隙。

返回
作者最近主题: