題目描述
* 給定一個二叉樹,返回其節點值自底向上的層次遍歷。
* 即按從葉子節點所在層到根節點所在的層,逐層從左向右遍歷
*
* 例如:
* 給定二叉樹 [3,9,20,null,null,15,7]
* 3
* / \
* 9 20
* / \
* 15 7
* 返回其自底向上的層次遍歷爲:
* [
* [15,7],
* [9,20],
* [3]
* ]
*
解題思路
* 因爲須要按層進行組成,且是vector<vector<int>>
* 因此必須把每一個層分開記錄,另外一點就是還要實現逆序
* 分層能夠經過單獨記錄每層節點來完成,而逆序有兩種方式
* 第一種是直接正序記錄,而後再顛倒順序
* 第二種是進行遞歸記錄每層節點,最後在每層中添加數據
* 這樣第二種就省去了第一種方法中顛倒順序這步的操做
*
示例代碼
/**
* 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>> levelOrderBottom(TreeNode* root) {
if (root == NULL)
return {};
vector<vector<int>> res;
vector<TreeNode *> nodes;
nodes.push_back(root);
do_order(nodes, res);
return res;
}
void do_order(vector<TreeNode *> &nodes, vector<vector<int>> &res) {
if (nodes.size() == 0)
return;
vector<TreeNode *> next_level;
for (int i=0; i<nodes.size(); i++) {
if (nodes[i]->left)
next_level.push_back(nodes[i]->left);
if (nodes[i]->right)
next_level.push_back(nodes[i]->right);
}
do_order(next_level, res);
vector<int> temp;
for (int i=0; i<nodes.size(); i++) {
temp.push_back(nodes[i]->val);
}
res.push_back(temp);
}
};