107. 二叉树的层次遍历 II
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
该题为 102. 二叉树的层次遍历的进阶版。
有关102. 二叉树的层次遍历的题解,请参考429. N叉树的层序遍历,具体思路是一样的,不再赘述。
Solution1(迭代版):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Solution { public: vector<vector<int>> levelOrderBottom(TreeNode* root) { vector<vector<int> > res; if(!root) return res; queue<TreeNode*> q; q.push(root); while(!q.empty()){ int len = q.size(); vector<int> curLayerNodes; TreeNode* t; while(len--){ t = q.front(); q.pop(); curLayerNodes.push_back(t->val); if(t->left) q.push(t->left); if(t->right) q.push(t->right); } res.emplace(res.begin(),curLayerNodes); } return res; } };
|
Solution2(递归版):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public: vector<vector<int>> levelOrderBottom(TreeNode* root) { vector<vector<int>> res; preorder(root,1,res); return res; } void preorder(TreeNode* node, int depth, vector<vector<int>> &res){ if(!node) return; if(res.size() < depth){ vector<int> t; t.push_back(node->val); res.emplace(res.begin(), t); }else{ res[res.size()-depth].push_back(node->val); } preorder(node->left, depth+1, res); preorder(node->right, depth+1, res); } };
|
具体思路就是增加一层,就将该层放到头位置。
vector.emplace()配合vector.begin()实现插到头位置。