Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 为什么队列用于二叉树的水平顺序遍历?_Algorithm_Data Structures_Queue_Binary Tree - Fatal编程技术网

Algorithm 为什么队列用于二叉树的水平顺序遍历?

Algorithm 为什么队列用于二叉树的水平顺序遍历?,algorithm,data-structures,queue,binary-tree,Algorithm,Data Structures,Queue,Binary Tree,我不确定这些问题是否被接受,如果不被接受,我将很乐意删除/编辑它,但我认为这不仅仅是一个讨论问题,其答案将取决于意见和解决方案背后的事实 所以我读到了关于二叉树的级序遍历,当我们使用队列数据结构时,存在一个O(n)解决方案 算法是这样的 1) 创建一个空队列q 2) 临时节点=根节点 3) 当临时节点不为空时循环 a) print temp_node->data. b) Enqueue temp_node’s children (first left then right children

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

所以我读到了关于二叉树的级序遍历,当我们使用队列数据结构时,存在一个
O(n)
解决方案

算法是这样的

1) 创建一个空队列q

2) 临时节点=根节点

3) 当临时节点不为空时循环

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

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

我认为如果您对BFS进行更多研究,您将自动获得答案

队列具有特殊属性,您可以从一端推送,从另一端弹出。
按他们穿过的顺序

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


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

通常,当我们在顺序遍历过程中访问一个节点(比如N)时,我们首先在队列中推它的左子节点,然后推右子节点(假设两者都存在),然后移动到队列中的下一个元素

现在,下一个元素将是先前访问的节点N的正确元素

基本上,递归和队列的FIFO属性相结合,允许您按顺序遍历

但这不是“顺序遍历”。Q中树的顺序是4-2-5-1-3。使用DFS/堆栈(后进先出)完成此操作。但你是对的,先进先出的特性使它成为广度第一。