我理解使用队列逐级访问二叉搜索树中的节点的逻辑。 然而,我试图在C中实现,但我被困,因为我不知道如何正确排队。从root开始我可以创建一个Queue但是之后如果我将root的子节点添加到队列中,我将丢失这些新节点的子节点,因为每次添加新节点时我都会修改Queue中的连接。
我可以创建一个新的数据类型,在链接列表队列中有另外一个链接可以使用。这里最好的方法是什么?
答案 0 :(得分:1)
逐级访问二进制搜索树中的节点
有一个名字:它被称为"广度优先"遍历树。从空队列开始,您将根节点入队,然后重复出队队列中的第一个节点,以某种方式处理它,并将所有节点的子节点排队,直到没有更多节点入队。确切地说,您应该将节点的子节点相对于该节点的其他处理进行排队,这可能取决于您打算执行哪些处理,特别是如果它涉及从结构上修改树。
只要每个节点的处理只影响以当前节点为根的子树,这一切都很好。但是,如果您需要能够影响整个树的其他部分,那么广度优先遍历可能不适合您的任务。
你说
[我]不知道如何正确地排队。从root [I]开始可以创建一个Queue但是之后如果[I]将根的子节点添加到队列中[I]将丢失这些新节点的子节点,因为[I]我正在修改Queue中的连接时间a添加一个新节点。
这里的关键概念是队列中的成员资格和位置是独立的,并且与树中的成员资格和位置无关。您可以通过向节点结构本身添加其他链接来管理它,或者通过为包含指向排队BST节点的指针的队列元素创建新结构来管理它。后者将树与队列分离,许多人(包括我)认为这对于大多数目的来说都是可取的。