Question:node
Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root).測試
For example:
Given binary tree {3,9,20,#,#,15,7},spa
3 / \ 9 20 / \ 15 7
return its bottom-up level order traversal as:code
[ [15,7], [9,20], [3] ]
Solution:blog
藉助隊列,層序遍歷,在隊列中記錄這個節點是第幾層的。在從隊列中取節點,同層的放在一個vector中,若是新的一層的節點出現了,則把上一層的vector放入到vector的vector中。這樣記錄的是從上到下遍歷的結果,把vector反轉便可。代碼以下,經過了leetcode的在線測試。隊列
/** * Definition for binary tree * 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) { vector<vector<int> > vecRes; if (!root) return vecRes; queue<pair<TreeNode*, int> > nodeQue; // first is val, second is layer vector<vector<int> > vecWorker; vector<int> vec; nodeQue.push(make_pair(root, 1)); int layer = 1; while (!nodeQue.empty()) { TreeNode* node = nodeQue.front().first; int nodeLayer = nodeQue.front().second; nodeQue.pop(); if (nodeLayer > layer) { vecWorker.push_back(vec); vec.clear(); layer = nodeLayer; } vec.push_back(node->val); if (node->left) { nodeQue.push(make_pair(node->left, nodeLayer+1)); } if (node->right) { nodeQue.push(make_pair(node->right, nodeLayer+1)); } } vecWorker.push_back(vec); for (int i = vecWorker.size()-1; i >= 0; i--) { vecRes.push_back(vecWorker[i]); } return vecRes; } };
時間複雜度,O(n),n是樹的節點數。leetcode