树————二叉树的层次遍历(2)
方法:
总体思想:
用队列实现对树的遍历。
两层代码块:
1、将每一层的节点放入到队列中
2、然后对这一层的节点进行遍历,将这些节点放入到temp临时变量中
遍历的过程中,将每一个节点删除pop,并且将下一层的节点放入到队列中
3、遍历完将temp添加到res中,同时检查队列是否为空,直到空的时候,完成遍历,返回res
1 * Definition for a binary tree node. 2 * struct TreeNode { 3 * int val; 4 * TreeNode *left; 5 * TreeNode *right; 6 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 7 * }; 8 */ 9 class Solution 10 { 11 public: 12 vector<vector<int>> levelOrderBottom(TreeNode* root) 13 { 14 vector<vector<int>> res;//结果 15 if(root==NULL) 16 return res; 17 18 queue<TreeNode*> q;//定义一个队列,用来放树 19 q.push(root);//先把整棵树放进去,这个队列后面一直在补充子节点, 20 { 21 vector<int> temp;//放每一层的节点 22 int len = q.size();//len是每一层的节点数,因为这个队列会一直向后面补充节点,所以设为定值,这样当前层的节点数遍历完了之后,就继续下一层 23 for(int i=0;i<len;i++) 24 { 25 TreeNode* now = q.front();//获取队列的第一个节点 26 q.pop();//弹出 27 temp.push_back(now->val);//将这个节点放入到temp 28 if(now->left!=NULL) q.push(now->left);//然后看这个节点左右子节点是否存在,存在的话放进去 29 if(now->right!=NULL) q.push(now->right); 30 }//这个for循环完了之后,不仅放这一层的所有节点都放进temp,而且,也把这些节点pop出去了,而且,也把这一层的每一个节点的左右子节点都放入到了队列中,也就是将当前层的节点pop,下一层的所有节点都放进去了 31 res.insert(res.begin(), temp);//将临时变量保存到结果中(从前面插入) 32 } 33 return res; 34 } 35 };