问题导入
二叉树的层次遍历问题
解法分析
层次遍历的问题本质是广度优先搜索,然而此题不仅需要按层访问,还需要对不同的层次做出区分。这里既然要以数组的形式作为返回值,就直接考虑按数组长度来区分层次。当访问完某一层的元素时,当前待访问队列的长度恰好就是下一层的长度,初始层为根结点。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> rtn; rtn.clear(); vector<int> temp; queue<TreeNode*> qt; while (!qt.empty()) qt.pop(); if (root == NULL) return rtn; qt.push(root); while (qt.size() != 0) { int length = qt.size(); temp.clear(); while (length > 0) { TreeNode* item = qt.front(); qt.pop(); temp.push_back(item->val); if (item->left != NULL) qt.push(item->left); if (item->right != NULL) qt.push(item->right); length--; } rtn.push_back(temp); } return rtn; } };
思维拓展
除了上述求解之外,其实还有一些比较好的区分层次的的方法,譬如 使用分隔符,在开始某一层的访问时,在队列尾部插入分隔符,当访问到它时即表明当前层遍历完毕。这里给出伪代码实现以供参考。
queue = [node] while queue.length != 0 queue.push "$" while(true) item = queue.front break if item == '$' visit(item) queue.push(item.left) if item.left != NULL queue.push(item.right) if item.right != NULL