102- Binary Tree Level Order Traversal

来源:互联网 发布:淘宝千牛是什么 编辑:程序博客网 时间:2024/05/29 11:53

类别:BFS
难度:medium

题目描述

这里写图片描述

算法分析

(1)广度优先算法,使用队列辅助实现
(2)如果单纯是从左到右,逐层遍历二叉树的话,就很简单:
最初将根节点压入队列中,在队列不为空的情况下,不断的从队头取出元素,并且将队头元素的左右节点压入队列中,知道队列为空,则遍历结束。
(4)这道题目与普通的遍历存在一个不同的地方是:需要按层进行分析,所以使用了一个level作为标记,并且压入队列中的除了节点以外附加了level的信息,这样当从队列中取出元素的时候如果是旧的level,则直接压入数组中,如果是新的level,则将原来那一层先存在result中,然后删除数组,并将新的节点放入数组中,开始新的一层的数组。
(5)需要注意的一点是,在进行vector的erase操作的时候,因为使用的是iterator,从头往后进行删除,每次删除完了以后,后面的数字就往前移动了,所以it不需要++,如果在for中使用it++,则在内部实现中需要使用it–.

代码实现

class Solution {public:    vector<vector<int>> levelOrder(TreeNode* root) {        vector<vector<int>> result;        if (root == NULL) return result;        queue<pair<TreeNode*, int> > que;        que.push(make_pair(root, 0));        int curlevel = -1;        int level = 0;        pair<TreeNode*, int> curNode;        vector<int> nodes;        // BFS ---- using queue        while (!que.empty()) {            curNode = que.front();            que.pop();            if (curNode.second != curlevel) {                curlevel = curNode.second;                if (nodes.size() != NULL) {                    result.push_back(nodes);                }                // notice no it++                for (auto it = nodes.begin(); it != nodes.end();) {                    nodes.erase(it);                }            }            nodes.push_back(curNode.first->val);            if (curNode.first->left != NULL) {                que.push(make_pair(curNode.first->left, curlevel + 1));            }            if (curNode.first->right != NULL) {                que.push(make_pair(curNode.first->right, curlevel + 1));            }        }        if (!nodes.empty()) result.push_back(nodes);        return result;         }};
原创粉丝点击