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

时间:2016-08-26 23:26:19

标签: python-3.x binary-search-tree

所以我试图创建一个方法,将二进制搜索树的所有节点都返回给我,而不删除它们。我想让我的数据结构不受影响。 但我无法找到办法!

唯一认为a成功的是创建一个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)

那么有没有办法从二叉搜索树中获取所有项目 没有破坏它?

1 个答案:

答案 0 :(得分:2)

如果没有代码实现您的BST并且没有您希望结果看起来像,那么很难说清楚。

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

  1. Curent节点没有正确的子节点 - 在这种情况下,我们需要向左移动到当前
  2. 当前节点只有没有左子项的右子节点 - 我们向右移动到当前
  3. 当前节点有正确的子节点和左子节点 - 需要将右子节目移动到当前
  4. 似乎你正在重新发明轮子,但是在Python here中几乎有标志性的BST实现

    希望有所帮助。