📜  以Min Max时尚打印二进制搜索树(1)

📅  最后修改于: 2023-12-03 15:22:03.735000             🧑  作者: Mango

以Min Max时尚打印二进制搜索树

简介

二进制搜索树是一种常用的数据结构,主要用于实现查找、插入和删除操作。而以Min Max时尚打印的二进制搜索树则是一种更加美观的输出方式。

二叉搜索树

二叉搜索树是一种树形数据结构,满足以下条件:

  1. 左子树上所有结点的值均小于它的根结点的值。
  2. 右子树上所有结点的值均大于它的根结点的值。
  3. 左右子树也分别为二叉搜索树。

这样的数据结构有很多实际应用,如哈希表、字典和数据库的索引。

Min Max时尚打印

为了更加美观的展示二叉搜索树,可以使用MinMax时尚打印方法。该方法的主要思想是在每个结点上打印其最小值和最大值,同时给每条边上色以区分左右子树的范围。

输出效果图

以下是该方法输出的效果图:

          ________________{10,19}______________
         |                                      |
     ____{4,6}___                          ____{15,19}___
    |            |                        |             |
  _{2,2}_    ____{8,8}___            ___{13,14}_     _{17,18}
 |      |   |            |          |           |   |
{1,1}  {3,3} {5,5}      {9,9}      {12,12}    {16,16}

可以看到,每个叶子结点上方的数字代表该结点的值,花括号中的数字代表该子树中最小和最大的值。

核心代码

下方是使用Python语言实现该方法的核心代码段:

def max_width(root):
    if not root: return 0
    def get_width(node, depth):
        if not node: return 0
        if depth == 1: return 1
        left_width = get_width(node.left, depth-1)
        right_width = get_width(node.right, depth-1)
        return left_width + right_width
    height = get_height(root)
    widths = [get_width(root, i) for i in range(1, height+1)]
    return max(widths)

def print_tree(root):
    if not root: return
    from queue import Queue
    q = Queue()
    q.put(root)
    height = get_height(root)
    max_val = max_width(root) * 5
    res = []
    id = 0
    for i in range(1, height+1):
        [res.append([' '*max_val]) for _ in range(2**i)]
    while not q.empty():
        n = q.qsize()
        id += 1
        for i in range(n):
            node = q.get()
            if not node: q.put(None); q.put(None); continue
            val = get_val(node)
            lborder, rborder = get_border(node, max_val)
            label = str(val) + ' '*(len(lborder)+len(rborder)-len(str(val)))
            res[2**id-2+i][len(lborder):len(lborder)+len(label)] = label
            res[2**id-1+i] = lborder + '/' + '_'*(len(label)-2) + '\\' + rborder
            q.put(node.left)
            q.put(node.right)
        if all(not any(s.strip()) for s in res[2**id-2:2**id]): break
    for line in res:
        print(line)

其中get_borderget_val分别是获取该节点最小、最大值和该节点的值的函数。

结语

以上就是以Min Max时尚打印的二进制搜索树的介绍。这种打印方式可以使得二叉搜索树更加清晰美观,有利于开发者更好的理解和调试代码。