题目描述:
- 首先我们考虑一下如何进行层次遍历,【3】
【9,20】
【15,7】
我们可以先看看普通的层次遍历如何实现,广度优先搜索需要借助一个特殊的数据结构进行实现,那就是队列,队列的特点先进先出,符合我们的要求。深度优先搜索则是借助栈实现的,先进后出。
实现思路:
首先定义一个队列q,里面存储结点,在定义一个存放结果的result类型为vector<vector<int>>类型,在定义一个vector<int> vec进行存储每一层。
首先判断头结点是否为空,不为空将头结点压入到队列中,定义一个size保存队列的大小,注意此时不可以直接使用q.size,因为队列是不断变化的。以队列不为空为条件,进入while循环,利用for循环依次取出队列中的元素,在取元素的过程中,需要进行的操作有:
①取出队列的头元素保存在node变量中,将这个结点出队,将node的val值保存到vec变量中。
②判断刚刚取出的那个结点是否存在左右结点,如果存在进入队列中
结束for循环之后,说明此层的元素已经都出来并保存在vec中了,将vec压入到result变量中。清除vec中的内容,继续下一层的变量。
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> que;
if (root != NULL) que.push(root);
vector<vector<int>> result;
while (!que.empty()) {
int size = que.size();
vector<int> vec;
// 这里一定要使用固定大小size,不要使用que.size(),因为que.size是不断变化的
for (int i = 0; i < size; i++) {
TreeNode* node = que.front();
que.pop();
vec.push_back(node->val);
if (node->left) que.push(node->left);
if (node->right) que.push(node->right);
}
result.push_back(vec);
}
return result;
}
};
代码实现:
有了上面铺垫,这道题就是将结果reverse一下就可以了。可以将上面的代码看做是个层次遍历的模板,许多问题都可以在上面的基础上稍加修改就可以实现了。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int> > result;
queue<TreeNode*> q;
if(root!=NULL) q.push(root);
vector<int> vec;
while(!q.empty()){
int size=q.size();
for(int i=0;i<size;i++){
TreeNode *node=q.front();
q.pop();
vec.push_back(node->val);
if(node->left){
q.push(node->left);
}
if(node->right){
q.push(node->right);
}
}
result.push_back(vec);
vec.clear();
}
reverse(result.begin(), result.end()); // reverse()翻转函数
return result;
}
};