给定一个二叉树,以层次方式打印各层元素,如下。用到广度优先遍历。以广度优先,就是说一层层地打印,这样,先入的就先打印,所以用到的数据据结构是队列。而深度优先,则是先遍历完一个分支才进行第二个分支,用的是栈结构。
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).
For example:
Given binary tree {3,9,20,#,#,15,7}
,
3 / \ 9 20 / \ 15 7
return its level order traversal as:
[ [3], [9,20], [15,7] ]
/** * 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>> ret; vector<int> v; if (!root) return ret; int cur_level = 1;//当前所在层次 int cur_level_num = 1;//当前层次还有多少个元素要打印 int next_level_num = 0;//下一个层次有多少个元素要打印 queue<TreeNode*> q;//广度优先必用数据结构 q.push(root); while (!(q.empty())) { root = q.front(); q.pop(); v.push_back(root->val);//要打印的元素保存 --cur_level_num;//要打印的元素减一 if (root->left)//这说明是下一层的元素 { q.push(root->left); ++next_level_num; } if (root->right) { q.push(root->right); ++next_level_num; } if (0 == cur_level_num)//换层标志,各种初始化 { cur_level_num = next_level_num; next_level_num = 0; ++cur_level; ret.push_back(v); v.clear(); } } return ret; } };