如何在不破坏树的情况下从BST弹出所有项目?

babaliaris

因此,我试图创建一种方法,该方法将二进制搜索树的所有节点返回给我,而不删除它们。我想让我的数据结构保持不变。但是我找不到办法!

成功的唯一想法是创建一个pop方法,该方法返回bst的根(克隆),然后删除它。代码是这样的:

    def pop(self):

    #Empty tree.
    if self.root == None:
        return None

    #Copy the root.
    return_node = self.root.clone()

    #Find MAX Node.
    if self.root.left != None:

        #Starting node.
        MAX = self.root.left

        #Find max node.
        while MAX.right != None:
            MAX = MAX.right

        #Swap data with root.
        self.root.swap_data(MAX)

        #Destroy max node.
        MAX.destroy()



    #Find MIN Node.
    elif self.root.right != None:

        #Starting node.
        MIN = self.root.right

        #Find max node.
        while MIN.left != None:
            MIN = MIN.left

        #Swap data with root.
        self.root.swap_data(MIN)

        #Destroy max node.
        MIN.destroy()


    #Else set root to none.
    else:
        self.root = None



    #Return the poped node.
    self.size -= 1
    return return_node

因此,此代码在此循环中的工作原理很吸引人:

node = tree.pop()

while node != None:
    #Do something with current node

    node = tree.pop() #Keep moving.

但是问题在于,这棵树最终将被摧毁。

之后,我认为遍历方法可以解决问题,但我无法成功。

def preorder(self, root):

    if root == None:
        return

    #Do something here.
    #But how am i going to return all the nodes
    #Using this traversal method?

    self.preorder(root.left)
    self.preorder(root.right)

那么,有没有一种方法可以从二进制搜索树中获取所有项目而又不破坏它呢?

索德涅夫

没有实现BST的代码和没有结果的样子很难讲

您提供的pop方法不正确。在删除节点期间,可能出现3种情况:

  1. 当前节点没有右子节点-在这种情况下,我们需要向左移动到当前
  2. 当前节点只有右子节点,而没有左子子-我们向右移动到当前子节点
  3. 当前节点的右子节点带有左子斜坡-需要将右子节点中的大多数向左移动到当前子节点

似乎你重新发明轮子,但有在Python几乎标志性的实施BST的位置

希望能有所帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不破坏现有HTML的情况下更改DOM中的所有文本?

表格分区 - 如何在不破坏所有内容的情况下添加列?

如何在不破坏角度数据绑定的情况下更新集合中的项目?

如何在不破坏AnonymousQueue的情况下暂停@RabbitListener

如何在不破坏循环的情况下返回变量?

如何在不破坏依赖的情况下删除ImageMagick?

如何在不破坏画布的情况下刷新数据

如何在不破坏列表的情况下释放指针?

如何在不破坏原有代码的情况下增加函数的返回值?

如何在不破坏现有设置的情况下更改akka-scala响应模型

如何在不编辑的情况下将.js文件包含到项目的所有jsp页面中?

在Microsoft Word中,如何在不破坏交叉引用的情况下更改枚举列表中项目的顺序?

如何在不破坏现有客户端的情况下扩展terraform模块输入变量模式?

如何在不破坏SOLID的情况下从具有不同类型的表中获取记录

如何在不更改全局打印选项的情况下显示数据框的所有列?

如何在不获取所有组合的情况下获得大括号扩张对?

如何在不丢失所有行的情况下获取特定列的SUM?

如何在不事先知道密钥的情况下检索所有localStorage项?

Mockito:如何在不模拟所有参数的情况下轻松存根方法

如何在不编写长查询的情况下查询所有GraphQL类型字段?

如何在不选择所有节点的情况下禁用TreeView控件?

如何在不丢失列标题的情况下打印所有 docker 容器?

如何在不访问任何元素的情况下对结构的所有字节进行操作?

如何在不遍历所有Makefile的情况下构建启动映像

如何在不构建所有Android的情况下构建AOSP应用?

如何在不延迟所有其他功能的情况下延迟 Pygame 中的事件?

如何在不导入所有内容的情况下触发功能?

如何在不滚动所有日志的情况下查看最新的 Google Stackdriver 日志

如何在不按名称调用的情况下打印所有变量及其函数值?