@zimenglan
2015-01-29T03:34:49.000000Z
字数 2010
阅读 1416
leetcode dfs bfs
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]
]
这道题和Binary Tree Level Order Traversal差不多的, 关键在于将最后的结果反转就可以了, 调用std::reverse函数即可, 具体看代码
/*** 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> > res;// Solution 1: dfs// const int level = 1;// dfs(root, level, res);// Solution 2: bfsbfs(root, res);// reversestd::reverse(res.begin(), res.end());return res;}// 每个节点所在的level刚好与其在res对应的vector的下标对应起来// 通过给每个node做标记, 该标记就是其在树中的level, dfs能很好完成标记任务// 在标记level的时候, 实例化对应的vector, 并将其加入到res中// 这样通过level来找到node对应的vector, 并将其值val加入到vector中// 递归以上操作void dfs(TreeNode* root, const int level, vector<vector<int> >& res) {if(root == NULL) return;if(level > res.size()) {// 实例化res.push_back(vector<int>());}res[level - 1].push_back(root->val);// 递归操作dfs(root->left, level + 1, res);dfs(root->right, level + 1, res);}// 其实这道题适合用bfs来弄, 因为比较直观// 不管dfs还是bfs, 关键在于找到标记信息, dfs中的标记信息为level,// bfs中的标记信息为NULL// 每次遇到NULL, 则更新res// 值得注意的时, 每次遇到标志信息时, 需要检查当前队列是否为空,// 否则会导致死循环void bfs(TreeNode* root, vector<vector<int> >& res) {if(root == NULL) return;// 这里可以用queue替代list, 需要注意的是, list和queue的函数名有点出入// queue<TreeNode*) que;list<TreeNode*> que;TreeNode* anno = NULL;vector<int> subRes;que.push_back(root);que.push_back(anno);while(!que.empty()) {const TreeNode* top = que.front();que.pop_front();// 如果top不等于标记节点anno, 则添加当前节点到subRes中if(top != anno) {subRes.push_back(top->val);// 如果top的左右孩子节点不为空, 则添加到队列中// 为了防止空孩子节点充当标记节点annoif(top->left != anno) que.push_back(top->left);if(top->right != anno) que.push_back(top->right);// top等于当前标记节点anno, 则将某个level的所有节点加入到res中// 也就是将subRes加入到res中} else {res.push_back(subRes);// 需要注意!!!// 需要判断当前是否为队列尾, 不为队列尾, 则添加标记节点anno// 否则会导致死循环if(!que.empty()) {// 将标记节点anno加入队列que.push_back(anno);// 清空subRessubRes.clear();}}}}};