【问题标题】:Why does a queue work for level order traversal of a binary tree?为什么队列适用于二叉树的级别顺序遍历?
【发布时间】:2017-07-21 16:26:14
【问题描述】:

我不确定这些问题是否被接受,如果不被接受,我很乐意删除/编辑它,但我认为这不仅仅是一个讨论问题,其答案将取决于意见,而事实背后隐藏着一个事实解决方案。

所以我正在阅读二叉树的级别顺序遍历,当我们使用队列数据结构时存在O(n) 解决方案。

算法是这样的

1) 创建一个空队列q

2) temp_node = 根

3) 当 temp_node 不为 NULL 时循环

a) print temp_node->data.
b) Enqueue temp_node’s children (first left then right children) to q
c) Dequeue a node from q and assign it’s value to temp_node

我了解算法,但我无法理解的是,如果他事先不知道这个解决方案,他将如何提出这个解决方案。换句话说,队列的什么属性(可能是二叉树)使它成为在这种情况下使用的正确 DS。在这里使用队列进行二叉树的级别顺序遍历背后的想法是什么?谢谢!!

上述树的层序遍历为1 2 3 4 5

【问题讨论】:

    标签: algorithm data-structures queue binary-tree


    【解决方案1】:

    当您以宽度优先遍历树时,宽度会越来越宽。您需要一个队列来跟踪子树的根,以便接下来更深入地访问,例如“待办事项”列表。

    【讨论】:

      【解决方案2】:

      我想如果你多学习BFS,你会自动得到答案。

      队列具有特殊属性,您可以从一端推送并从另一端弹出。
      按照它们遍历的顺序

      就像在级别顺序遍历中我们标记节点访问并弹出它们,从另一端我们推送要标记访问的元素,这就是级别顺序遍历所做的。

      仔细看两个操作,两个操作是相互独立的。这种操作隔离是由队列提供的。

      【讨论】:

        【解决方案3】:

        一般来说,当我们在中序遍历期间访问一个节点(比如 N)时,我们先将其左孩子推入队列,然后将右孩子推入队列(假设两者都存在),然后移动到队列中的下一个元素。

        现在下一个元素将是之前访问过的节点 N 的右元素。

        基本上,递归结合队列的 FIFO 属性可以让您进行按顺序遍历。

        【讨论】:

        • 这不是“按顺序遍历”。 Q中树的顺序是4-2-5-1-3。这是通过 DFS / 堆栈 (LIFO) 完成的。但你说得对,FIFO 属性是广度优先的原因。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-01
        相关资源
        最近更新 更多