二叉树的级别顺序遍历

时间:2016-06-19 12:01:22

标签: c++ stl queue binary-tree

我正在编写用于二叉树的级别顺序遍历的c ++函数,

但它不打印所有级别,有人可以告诉这段代码有什么问题吗? 这是我的代码:##

var images = document.querySelectorAll("img");

for(var i = 0;i < images.length;i++){
  var image = images[i];
  window.open(image.src,"_blank");
}

// changing for a kitty image
var images = document.querySelectorAll("img");

for(var i = 0;i < images.length;i++){
   var image = images[i];
   image.src = "http://placekitten.com/600/338";
}

1 个答案:

答案 0 :(得分:0)

总结此代码中的整体逻辑:

1)维护一个队列,每个级别的节点都被推入,并在每个级别的最后一个元素之后推送NULL指针。通过将根元素推入队列,然后是NULL

,可以启动此算法

2)每个级别的元素都会从队列中弹出,并且它的子级会立即被推回队列。

3)当NULL指针从队列中弹出时,它必须意味着队列没有充满下一级别的元素,因此NULL会立即被推回到队列。

4)代码首先将队列中的所有元素收集到临时缓冲区v中。当NULL指针从队列中弹出时,v现在包含二叉树中单个级别的所有元素,vpush_back()编入res },此函数的返回值。

错误发生在代码的这一部分:

        ptr = q.front();
        q.pop();

        if(q.empty())
            break;

这将从队列中删除下一个元素。如果队列为空 ,则该算法将终止。

这里的意图是队列中最后一个剩余的值始终是树中最低级别最后一个值末尾的NULL指针。队列现在已完全耗尽,算法终止。

不幸的是,该算法收集了v向量中树中最低级别的所有值,并且完全跳过了保存它们的以下代码段:

                q.push(NULL);
                res.push_back(v);
                v.clear();

push_back()永远不会在树的底层执行。此函数的最终结果将永远不会包含二叉树中的最低级别。

将终止条件更改为:

        if(q.empty())
        {
            res.push_back(v);
            break;
        }