当前位置: 首页 > 知识库问答 >
问题:

如何在python中打印二叉搜索树?

丌官绍元
2023-03-14

下面是一个二叉查找树,它有一个根节点、一个左节点和一个右节点。代码有效,但我想显示这个二叉查找树,这样我就可以看到图层中的每个节点…这是代码…

class Node:
    def __init__(self,value):
        self.value = value
        self.left = None
        self.right = None

class Binary_search_tree:
    def __init__(self):
        self.root=None

    def insert(self,value):
        if self.root==None:
            self.root=Node(value)
        else:
            self.insert_after_root(value)

    def insert_after_root(self, value):
        if value > self.root.value:
            self.root.left = Node(value)
        elif value < self.root.value:
            self.root.right = Node(value)

bst = Binary_search_tree()
bst.insert(4)
bst.insert_after_root(2)
bst.insert_after_root(8)

共有2个答案

屈昊天
2023-03-14

下面是二叉搜索树的简单实现。另外,我建议你不要使用==运算符与,而不是使用,这里为什么我应该避免==无

class Node: 
    def __init__(self,key): 
        self.left = None
        self.right = None
        self.value = key 


def insert(root,node): 
    if root is None: 
        root = node 
    else: 
        if root.value < node.value: 
            if root.right is None: 
                root.right = node 
            else: 
                insert(root.right, node) 
        else: 
            if root.left is None: 
                root.left = node 
            else: 
                insert(root.left, node) 


def left_right(root): 
    if root: 
        left_right(root.left) 
        print(root.value)  # that shows your tree
        left_right(root.right) 
        

tree = Node(20) 
insert(tree,Node(30)) 
insert(tree,Node(10)) 
insert(tree,Node(40)) 
insert(tree,Node(90))

left_right(tree) 

钦高峯
2023-03-14

您的实现有一些问题:

>

  • 树只能有3个节点,因为您永远不会创建根的子代,而是始终将新节点设为根或其子代之一

    左/右颠倒:您应该在左侧插入较小的值。

    在主程序代码中,应该只使用< code>insert方法,而不要使用< code>insert_after_root。

    下面是对您的实现的修正,它基于递归(将一个方法放在< code >节点上),以及一组用于产生倾斜90°的字符串表示的附加方法(根显示在左侧)。

    class Node:
        def __init__(self,value):
            self.value = value
            self.left = None
            self.right = None
    
        def insert_after(self, value):
            if value < self.value:
                if self.left:
                    self.left.insert_after(value)
                else:
                    self.left = Node(value)
            elif value > self.value:
                if self.right:
                    self.right.insert_after(value)
                else:
                    self.right = Node(value)
            else:
                raise ValueError("this tree doesn't accept duplicates")
    
        def __repr__(self):
            lines = []
            if self.right:
                found = False
                for line in repr(self.right).split("\n"):
                    if line[0] != " ":
                        found = True
                        line = " ┌─" + line
                    elif found:
                        line = " | " + line
                    else:
                        line = "   " + line
                    lines.append(line)
            lines.append(str(self.value))
            if self.left:
                found = False
                for line in repr(self.left).split("\n"):
                    if line[0] != " ":
                        found = True
                        line = " └─" + line
                    elif found:
                        line = "   " + line
                    else:
                        line = " | " + line
                    lines.append(line)
            return "\n".join(lines)
    
    
    class Binary_search_tree:
        def __init__(self):
            self.root=None
    
        def insert(self,value):
            if self.root==None:
                self.root=Node(value)
            else:
                self.root.insert_after(value)
    
        def __repr__(self):
            return repr(self.root)
    
    bst = Binary_search_tree()
    bst.insert(4)
    bst.insert(2)
    bst.insert(8)
    bst.insert(3)
    bst.insert(5)
    bst.insert(7)
    bst.insert(10)
    
    print(str(bst))
    

  •  类似资料:
    • 我想以这种格式打印二叉查找树: 我想我必须获得树的深度,然后,对于每个级别,在每个元素前后打印一些空格。 我不知道如何继续。 节点类:

    • //执行顺序遍历的递归方法

    • 我一直在尝试从Node切换到Java,我想知道的一件事是如何以类似于Node显示的格式打印对象,例如二叉树。例如,我的二叉树初始化代码如下: 在节点中,此二叉树将显示如下: 然而在Java,当我做system.out.println(树); 输出->BinaryTree@4554617c 什么是打印我的BinaryTree的正确方法?什么是好方法?有没有一种方法可以用JSON格式打印树?

    • 问题内容: 我想以以下方式打印我的二叉树: 我已经编写了用于插入节点的代码,但是无法编写用于打印树的代码。所以请帮忙。我的代码是: 问题答案: 您正在寻找的是广度优先遍历,它使您可以逐级遍历树。基本上,您使用队列来跟踪需要访问的节点,并在运行时将孩子添加到队列的 后面 (而不是将它们添加到堆栈的 前面 )。首先开始工作。 完成此操作后,您可以找出树具有()的级别,并使用该级别来估计空白。如果要使空

    • 这里有问题 二叉搜索树(BST)是一种二叉树,其中每个节点的值大于或等于该节点左子树中所有节点的值,而小于该节点右子树中所有节点的值。 编写一个函数,根据使用的时间有效地检查给定的二叉搜索树是否包含给定的值。

    • 我有一个python代码来将字符串数学表达式转换为二叉树并对树的节点进行排序,这样左边的孩子总是比右边的孩子小。我想按以下顺序打印二叉树。 例如,考虑数学表达式((2*75)/4)。buildParseTree()将字符串表达式转换为树并printNodeInLevels()重新排列节点,以便在每个级别上左子节点小于右子节点。操作 我想按如下方式打印它。我该怎么办?因为数学表达式的长度一直在变化,