Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).
For example:
Given binary tree {3,9,20,#,#,15,7}
,
3 / \ 9 20 / \ 15 7
return its level order traversal as:
[ [3], [9,20], [15,7] ]
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], ]
思路:
把栈式的访问改成队列式的访问。深度优先搜索改为广度优先搜索。
题解:
/** * 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> > levelOrder(TreeNode *root) { if (!root) return vector<vector<int>>(); queue<pair<TreeNode*, int>> visit_list; vector<vector<int>> ret; visit_list.push(make_pair(root, 0)); while(!visit_list.empty()) { while(visit_list.front().second >= ret.size()) ret.push_back(vector<int>()); ret[visit_list.front().second].push_back(visit_list.front().first->val); if (visit_list.front().first->left != nullptr) visit_list.push(make_pair(visit_list.front().first->left, visit_list.front().second + 1)); if (visit_list.front().first->right != nullptr) visit_list.push(make_pair(visit_list.front().first->right, visit_list.front().second + 1)); visit_list.pop(); } return ret; } };
思路:
同上,只不过多一次std::reverse的工作。注意这里用reverse并不会带来vector的值交换,而只是交换vector内部的指针而已,所以性能没有什么损失。
题解:
/** * 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>> retval; if (root == nullptr) return retval; queue<pair<TreeNode*, int>> traverse; traverse.push(make_pair(root, 1)); while(!traverse.empty()) { auto front = traverse.front(); traverse.pop(); if (retval.size() < front.second) retval.push_back(vector<int>()); retval.back().push_back(front.first->val); if (front.first->left != nullptr) traverse.push(make_pair(front.first->left, front.second + 1)); if (front.first->right != nullptr) traverse.push(make_pair(front.first->right, front.second + 1)); } // since std::swap is used // there is actually no vector swap, just pointers swap reverse(begin(retval), end(retval)); return retval; } };