【Leetcode】【Easy】Binary Tree Level Order Traversal II
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}
,
3 / \ 9 20 / \ 15 7
return its bottom-up level order traversal as:
[ [15,7], [9,20], [3] ]
解题思路1:
可以在“Binary Tree Level Order Traversal”题目基础上,返回结果时,将结果反转。可以使用reverse(vec.begin(),vec.end())语句,也可以使用其他重新排列方式。
解题思路2:
和1中的BFS的思路一致,只是将每一层获取到的valLst插入vec的头部,这样就避免了最后再反转。
【★】注意:
由于vector内部数据结构是数组,因此从数组头部插入需要消耗更多的时间复杂度。
实践证明,先按正序填充vector再进行反转(思路1),比直接在头部插入(思路2)需要的时间明显减少。
时间消耗对比:
思路1:
思路2:
思路2代码(BFS):
1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 vector<vector<int> > levelOrderBottom(TreeNode *root) { 13 vector<vector<int> > levelOrderLst; 14 vector<int> valLst; 15 queue<TreeNode *> curLevelNodes; 16 17 if (!root) 18 return levelOrderLst; 19 20 curLevelNodes.push(root); 21 22 while (!curLevelNodes.empty()) { 23 int len = curLevelNodes.size(); 24 while (len--) { 25 valLst.push_back(curLevelNodes.front()->val); 26 27 if (curLevelNodes.front()->left) { 28 curLevelNodes.push(curLevelNodes.front()->left); 29 } 30 31 if (curLevelNodes.front()->right) { 32 curLevelNodes.push(curLevelNodes.front()->right); 33 } 34 35 curLevelNodes.pop(); 36 } 37 38 levelOrderLst.insert(levelOrderLst.begin(),valLst); 39 valLst.clear(); 40 } 41 42 return levelOrderLst; 43 } 44 };
附录:
vector