📜  二进制搜索树中所有节点的预购后继者(1)

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

二进制搜索树中所有节点的预购后继者

二进制搜索树是一种数据结构,它对于一组数据进行快速的插入和删除,并且对于查询操作具有较快的速度。在二进制搜索树中,每个节点都有一个值和两个分支,每个分支可能为空或者指向另一个节点。

在二进制搜索树中预购后继者指的是一个节点的后继节点,即在二进制搜索树中该节点的后面的哪个节点,这个节点的值比该节点的值大且是这个比该节点的值大的节点中最小的那个节点。

以下是一份Python代码,用于在二进制搜索树中查找所有节点的预购后继者。

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

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

    def insert(self, val):
        if not self.root:
            self.root = Node(val)
            return
        current = self.root
        while current:
            if current.val < val:
                if current.right:
                    current = current.right
                else:
                    current.right = Node(val)
                    break
            elif current.val > val:
                if current.left:
                    current = current.left
                else:
                    current.left = Node(val)
                    break

    def find_successors(self):
        self.populate_successors(self.root, None)

    def populate_successors(self, node, successor):
        if not node:
            return
        self.populate_successors(node.right, successor)
        node.successor = successor
        successor = node
        self.populate_successors(node.left, successor)

    def get_successors(self):
        successors = []
        node = self.root
        while node.left:
            node = node.left
        while node:
            successors.append(node.successor.val)
            node = node.successor
        return successors

在上面的代码中,我们首先定义了一个节点类 Node 和一个二进制搜索树类 BinarySearchTreeNode 类有一个 val 属性,表示该节点的值,以及 leftright 属性,分别表示该节点的左分支和右分支。 BinarySearchTree 类有一个 root 属性,表示二进制搜索树的根。

在插入操作中,我们首先检查根是否为空。如果根为空,则将插入的值分配给根节点。如果根不为空,则遍历树并在适当的位置插入值。

为了查找所有节点的预购后继者,我们定义了一个名为 find_successors() 的方法。在此方法中,我们使用 populate_successors() 方法遍历整个树,并为每个节点设置其后继节点。 该方法从最右侧的子节点开始,最后向左子树移动。在设置每个节点的后继节点时,我们使用了一个名为 successor 的局部变量,它包含前一个节点的值。当我们遍历左子树时,我们将该节点的值分配给 successor 变量。这样,当我们回溯到父节点时,我们就有了前一个节点的值,可以用它来设置父节点的后继节点。

最后,我们使用 get_successors() 方法返回所有节点的后继节点。我们使用 successors 列表存储所有节点的后继节点,并从根节点的最左子节点开始遍历整个树,同时将每个节点的后继节点添加到列表中。

以上就是一份Python代码,用于在二进制搜索树中查找所有节点的预购后继者。